The third layer looks at patterns instead of paths: how often, from where, with which user agent, in what order. It is the layer with the best reputation and the worst failure mode.

Behaviour beats a user-agent string, because one IP range carries both crawlers and scanners.

What this layer is

  • Rate limits: a visitor, an address or an agent may only do so much per minute before requests are delayed or dropped.
  • Behavioural bans: repeated hits on sensitive paths trigger a temporary block.
  • Slow and distributed scanning: many addresses, low rates, patient coverage - visible only across a long window.

What we run

We rate-limit our one state-changing endpoint (the enquiry form) at six requests per minute per address with a small burst, which is generous for humans and useless for automation. We do not auto-ban scanners, and that is a deliberate choice rather than an omission.

Where we disagree with the textbook

Automatic IP bans assume that a bad IP is a bad IP. Our own classification says otherwise: every top source address in our logs carries both crawler and scanner traffic, because both run from the same cloud ranges. A ban list built on volume would have removed the crawlers this site depends on. The usual mitigation is to whitelist verified crawler ranges — which works, but the whitelist is now load-bearing infrastructure, and user agents alone are trivially forged.

Slow, distributed scans are the harder problem. From a single origin log you can see that a pattern exists across many addresses; you cannot honestly attribute intent, and you cannot cleanly separate a patient scanner from a slow legitimate client. We publish the trend instead of pretending to a verdict.

How to verify

  • Rate limiting is visible in our lead endpoint behaviour; the service logs every delivery attempt and window.
  • The classification method is described in our own reporting; the same numbers appear in /data/live.json and the frozen record under /reports/.
  • Request volumes per engine are published as we count them, unverified automation included.
Sources: our own access log and classification; Cloudflare rate-limiting rules (developers.cloudflare.com), Cloudflare on verified bots (developers.cloudflare.com) and Google on verifying crawler requests (developers.google.com); OWASP automated threats for the abuse taxonomy (owasp.org).

Is rate limiting enough to stop scanning?

No. It bounds abuse of endpoints worth abusing; path refusal is what removes scanner noise, because scanners do not repeat the same path often.

Should I ban scanning IPs automatically?

Only if you can whitelist real crawlers and accept the maintenance. If your crawler and scanner traffic share ranges - as ours does - volume is not a safe signal.

Can I detect a distributed scan?

You can observe that a pattern spans many addresses. Attribution is a different claim, and we do not make it.

Related reading: Five Layers of Scanner Defence, Tested on Our Own Site · Layer 5: Closing the Loop in Public

More on this site: live signals · dated reports · how to verify us