Application layer attacks: when valid requests are the weapon
Application attacks send requests the server cannot refuse to process. Each one is well formed, arrives over a completed connection, and asks for something expensive. Volume stays low enough to look ordinary, and the site falls over because the work behind those requests exceeds what the backend can do.
Quick facts
- Layer
- Application (7)
- Vector
- Valid requests targeting expensive operations
- Goal
- Exhaust processing, memory, or the database
- In your logs
- Logs fill rather than empty; response times climb
- Does a WAF stop it?
- Yes, though by limiting and pricing requests rather than by recognising bad ones
That qualifier matters. There is no signature for a request that is identical to one a customer would send, so defence here works by controlling how many such requests a client may make and how much each costs, not by telling good from bad.
Why volume stays low
The economics are inverted compared with the other families.
A flood that fills a link needs bandwidth the attacker must have. A flood that exhausts an application needs only requests that are expensive for you and cheap for them. A search across a large table, a report, a page assembled from several database queries, an endpoint that resizes an image: each costs the sender one request and costs you real work.
The consequence is that this family is available to attackers without resources, and that the traffic graph stays unremarkable while the site becomes unusable. Anyone watching bandwidth alone sees nothing.
What makes a request expensive
Four properties, and knowing them tells you which of your own endpoints are exposed.
It cannot be cached. Anything personalised, anything reflecting a parameter, anything behind a login. Cached responses cost almost nothing to serve, which is why attacks avoid them.
It touches the database. Especially with a query whose cost grows with the data, such as an unbounded search or a filter across a large table.
It does work before checking anything. An endpoint that parses, decodes, or resizes before deciding whether the caller is allowed has already spent the resource.
It fans out. One request that triggers several internal calls multiplies the cost, which is common in interfaces assembled from multiple services.
The vectors in this category
| Vector | Mechanism | Distinguishing property |
|---|---|---|
| HTTP flood | Many ordinary requests, often to one path | Indistinguishable per request; only the pattern shows |
| Slowloris | Connections held open by sending headers slowly | Very few requests, very little traffic |
| Low and slow | Requests or bodies delivered at minimal rate | Designed to sit below rate thresholds |
| Carpet bombing | Traffic spread across many addresses and paths | Each source stays under any per-source limit |
| API abuse | Legitimate endpoints called in illegitimate volume | Lever per call, so volume can stay low |
Two of these deserve a note, because they defeat the obvious defence. Spreading traffic across many sources keeps every individual source below a per-client threshold while the total is overwhelming, and delivering requests slowly keeps the rate low by design. Both attack the assumption that abuse looks like a burst.
Recognising it
The signature is the opposite of a volumetric attack.
Logs fill rather than empty. Requests arrive, are processed, and are recorded. The evidence you need is in front of you, which is a genuine advantage of this category.
Response times climb before failures start. The backend saturates gradually rather than refusing outright, so the first symptom is slowness and the outage arrives later.
Traffic concentrates oddly. One expensive path receiving a share of requests unlike its usual share, a client population whose behaviour is too uniform, or a sudden absence of the ordinary variety in browsing patterns.
Cache effectiveness drops. Requests engineered to miss the cache show up as a falling hit ratio while total requests rise.
Mitigation by layer
Four defences, and unlike the other families they are things you or your provider control directly.
Limit by client and by endpoint. Not one global rate, but different allowances for different costs: an expensive search deserves a tighter limit than a static page. This is the first line and the most effective single measure.
Challenge rather than block. Where a client is suspect but not proven, asking it to do something a browser does easily and automation does not separates populations without denying anyone outright. Cheaper in false positives than a block.
Make expensive things cheaper. Caching what can be cached, bounding what a query may return, and checking authorisation before doing work removes the lever the attack depends on.
Absorb what remains at the edge. Requests filtered before reaching your origin cost your infrastructure nothing, which changes the arithmetic that made the attack viable.
When it is not an attack at all
This family has a twin that looks identical and needs a different response.
A misconfigured client retrying without limit, a partner integration that suddenly polls every second, a crawler that discovered a calendar with infinite dates: each produces the pattern of an application layer attack and none of it is hostile. The traffic is real, the requests are valid, and the cost to you is the same.
Telling them apart is often possible from the outside. Accidental load usually comes from few sources, keeps a regular rhythm, and stops when the other side is told about it. Deliberate load adapts: sources multiply, timing shifts, and paths change when one stops working.
The practical reason to check is that the fix differs entirely. An integration that needs a phone call should not be met with a permanent block, and an attacker will not be fixed by an email.
The cost of getting it wrong
Every defence here can refuse a customer, and that risk is inherent rather than a sign of poor configuration.
Rate limits set on the assumption of one user per address will misfire where many users share one, which is normal on mobile networks and in offices. Challenges break automation that you asked for: monitoring, payment callbacks, and integrations. Blocks placed during an incident outlive it.
The practical rule is that measures here should expire on their own and should be observable: a limit whose effect nobody can see is a limit nobody will remove. Where a decision is uncertain, slowing a client is safer than refusing it, because a delay that hits a customer is an annoyance and a block that hits a customer is a lost one.
Where the platform sits
This is the family Bridge WAF is built for, and the claim is narrower than it sounds. Requests are inspected before reaching your origin, rate limiting is applied per domain, and abusive patterns are handled without writing a rule for each variation. Because filtering happens at the edge, the requests that never arrive cost your servers nothing. What this does not address is anything that saturates a link, which is a different layer entirely. See what the platform offers at Bridge CDN.
Questions
What is a layer 7 DDoS attack?
An attack assembled from valid requests that ask for expensive work, so what runs out is the application's capacity rather than the network's. Nothing in the traffic is malformed, which removes the usual basis for discarding it and makes the defence a question of rate rather than correctness.
Does a WAF stop application layer attacks?
This is the one family where it genuinely applies, since complete requests exist to inspect and to count. The defence works by limiting how much any client may consume rather than by recognising bad requests, because there is no such thing as a bad request here.
Why is traffic volume low during one?
Because the cost falls on your backend rather than on the link. A request that costs a few hundred bytes to send can start a search, a report, or a write that occupies a worker for seconds, so bandwidth graphs stay calm while the application does not.
Why are these attacks hard to filter?
Because each request is identical to one a customer might send, so no single request contains the evidence. The distinguishing information exists only across many of them, in rate, sequence, and cost consumed, which means filtering has to reason about clients rather than packets.
Do rate limits solve it?
Partly, and their limits are known to whoever is sending. Traffic spread across many sources, or delivered slowly by each of them, is arranged specifically so that no individual client crosses a per-client threshold while the total comfortably exceeds capacity.
What is the risk of over-blocking?
Losing the customers you are protecting. Shared office addresses, mobile networks that place many users behind one address, and your own monitoring all produce traffic resembling what you want to stop, and none of them complains in a way that reaches you quickly.
The one family where request inspection genuinely applies, because complete requests exist to count.
off
No request is inspected and no limit is counted.
monitor
Matches and would-be refusals are recorded while every request is still served.
block
Matching requests are refused at the edge, before they cost your origin anything.
The firewall layer is included with Bridge CDN. Start in monitor: nothing is refused until you decide it should be.
Get started