← All AI Engineer talks

AI Engineer World's Fair 2025

How to defend your sites from AI bots

Read the talk

How to defend your site from AI bots

Effective bot defense starts with deciding which automation serves your users, then combines crawler verification, network signals, computational challenges and durable rate-limit keys.

From a talk by David Mytton

Before you start: Familiarity with HTTP requests, DNS and basic web application hosting will help you follow the implementation details.

What does an automated request cost your site?

What happens when bots visit your site at a scale your application was never designed to serve? David Mytton, who introduces himself as Arcjet’s founder, frames bot protection as something developers can implement themselves. He cites nearly 50% of web traffic overall and nearly 60% in gaming as automated, before widespread adoption of autonomous agents. Automation already includes both useful search crawlers and clients that consume resources without providing anything in return.

Slide titled “Up to 50% of internet traffic = bots” with stacked horizontal bars for industries and a legend for bad bot, good bot, and human traffic.
Bot and human traffic across industries.

A static page may be inexpensive to serve. A dynamic page can trigger database queries or other backend work on every request, with a serverless platform adding a per-request charge. Hundreds of thousands of automated requests turn that small unit cost into a substantial bill. Downloading large assets adds bandwidth costs and consumes capacity that legitimate users need. Eventually, the same pressure can make the service unavailable. Serverless shifts much of the capacity problem into billing; it does not make resources infinite.

0:160:29
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

0:16 · section reference included

Separate AI attribution from measurable traffic

A traffic spike does not establish that AI caused it. The more useful evidence identifies the clients involved or measures what changes when those clients are blocked. Mytton moves from general complaints to three concrete examples:

SiteReported observation
DiasporaMytton reports that GPTBot accounted for 24% of traffic.
Read the DocsTemporarily blocking Cloudflare-classified AI crawlers reduced downloaded-file bandwidth from about 800 GB/day to 200 GB/day.
WikipediaMytton cites roughly 35% bot traffic; the underlying measure is bot pageviews, not GPTBot’s share.

The Read the Docs incident report scopes its reduction to downloaded files, rather than total platform bandwidth. These examples expose different parts of the problem: a named crawler’s traffic share, the cost of bulk downloads, and the aggregate pressure from automation.

Slide titled “Is AI making it worse?” lists Diaspora: 24% of traffic = GPTBot; ReadTheDocs: 800GB/day to 200GB/day; Wikipedia: 35% of traffic = bots.
Traffic examples from Diaspora, ReadTheDocs, and Wikipedia.

The operational difference is how the content gets collected. A crawler that works gradually gives the site room to serve other users. A scraper that pulls content through hundreds of thousands of requests, without respecting the site’s rules, can overwhelm it regardless of why the scraper wants the data.

2:232:38
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

2:23 · section reference included

Decide which automation provides value

Search crawling has a familiar exchange: Googlebot visits and understands a site so that Google can index it, potentially sending visitors back. Bulk scrapers downloading images, content and files provide the contrasting case. AI crawlers sit between those categories because their value depends on what they do and what the site owner wants. Training collection does not necessarily produce referrals or any direct benefit for the source site.

Mytton distinguishes four kinds of OpenAI automation, beginning with search indexing. OAI-SearchBot collects content for ChatGPT search. Its role resembles a conventional search crawler: appearing in the index can produce citations, referrals and sign-ups. That gives a site owner a reason to allow it even when they do not want their content collected for training.

ChatGPT-User serves a different purpose: fetching content in response to a user’s request. Someone might paste a URL to summarize a page or ask for help implementing something from documentation. Mytton describes this retrieval as separate from training and notes that the response may not include a citation. Even so, blocking it can obstruct an existing user who has chosen an LLM as their interface.

GPTBot is the training crawler. Unlike search indexing, its collection does not promise a direct referral or citation. Keeping these purposes separate lets a site express a more useful policy than allowing or blocking every request associated with one AI provider.

Browser agents make the decision harder. An Operator-type agent can act for a person through a browser running in a virtual machine. Inbox triage in Gmail might be welcome; buying 500 concert tickets for resale probably is not. Both are automated actions on behalf of a user, but their effects on the service differ. Declared crawlers can identify themselves and undergo verification. In the demonstration’s framing, Operator instead arrives looking like Chrome. Whether automation is acceptable depends on the action, not merely the client’s name.

3:493:56
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

3:49 · section reference included

Start with robots.txt

robots.txt is a useful place to turn those decisions into crawler-specific instructions. For example, allowing search indexing while declining training collection can be expressed as:

User-agent: OAI-SearchBot
Allow: /

User-agent: GPTBot
Disallow: /

The file communicates policy; it does not enforce access. A crawler can still request a disallowed URL.

Mytton describes Googlebot and other cooperative search crawlers as following these instructions, and OpenAI as generally doing so. The distinction between crawling and user-directed retrieval matters here: OpenAI’s current crawler documentation says robots.txt may not apply to user-triggered actions. Hostile clients can ignore the file entirely—or use its disallowed paths to discover content worth fetching. Start here because it clarifies what you want each crawler to do, not because it protects private resources.

7:337:42
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

7:33 · section reference included

Verify the identity a crawler declares

The next signal is the User-Agent header. It commonly appears in request logs and provides a convenient starting point for classification. It is recommended, rather than mandatory, under HTTP Semantics. Many bots voluntarily identify themselves, so matching their declared names can still be productive.

Arcjet’s Well Known Bots catalog provides patterns and verification metadata for building those rules; Mytton describes a collection containing several thousand user agents. But the header is just a client-controlled string. A malicious client can claim to be Googlebot or Chrome as easily as it can give its own name. A declared identity is a classification hint, not authentication.

Verification checks the source behind that claim. Mytton names Apple, Bing, Google and OpenAI as providers whose crawlers can be verified. The procedure is provider-specific: Google supports reverse DNS followed by forward confirmation, while OpenAI’s current documentation publishes crawler IP lists. A reverse lookup alone is not a universal verification method.

The Googlebot slide demonstrates the round trip:

  1. Look up the request’s source IP address to obtain its hostname.
  2. Check that the hostname belongs to the provider’s documented crawler domain.
  3. Resolve that hostname and confirm that it includes the original source IP.

For the address shown on the slide, the shell lookups are:

bash

host 66.249.66.1
host crawl-66-249-66-1.googlebot.com

The displayed results map 66.249.66.1 to crawl-66-249-66-1.googlebot.com and back to the same address. Combining this source verification with the User-Agent lets an allow rule distinguish a desired crawler from a client merely borrowing its name.

“Defense 3/8: Verification” slide shows a terminal resolving 66.249.66.1 to crawl-66-249-66-1.googlebot.com, then resolving that hostname back to the same IP address.
Verifying a Googlebot address with reverse and forward DNS lookups.
8:408:55
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

8:40 · section reference included

Interpret network signals in application context

When declared identity and verification are insufficient, build a picture of normal behavior for individual IP addresses and address ranges. Bot detection is imperfect, so this is an accumulation of evidence rather than a single decisive test. Useful metadata includes network ownership, country, data-center origin and associations with particular operators. Mytton names MaxMind and IPinfo as sources, describing mostly paid databases alongside some free metadata APIs.

VPN, proxy, residential and mobile classifications add context. Mytton reports that AWS originated 12% of bot traffic reaching Cloudflare’s network in the year before the talk. That does not make every AWS request unwanted: a crawler visiting public pages may reasonably run in a data center. A data-center request submitting a form intended only for human sign-ups deserves different scrutiny. The same network attribute has different significance at different endpoints.

Country blocking is especially vulnerable to weak assumptions. Satellite and cellular connections can be geolocated to the IP owner rather than the person using the connection. Residential classification is also no guarantee of human activity: purchased proxy services route automated requests through home or mobile networks. Combine these attributes with observed behavior and retain local evidence about the traffic your application actually receives.

10:2710:39
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

10:27 · section reference included

Make abuse expensive without exhausting users

CAPTCHAs traditionally distinguish humans from automation by asking users to solve visual puzzles or manipulate objects. AI weakens that distinction: a model can interpret an image challenge, while an audio alternative can be downloaded and transcribed. Mytton describes these bypasses as cheap and fast, without presenting a task-specific benchmark.

Proof of work changes the question from whether the client can solve a human puzzle to whether it will spend computation before accessing a resource. The server requires a computational answer, shifting some cost onto the requester. Mytton illustrates the economics with a puzzle taking one or two seconds on an individual phone or laptop, repeated across tens of thousands or millions of sites. A small delay for one visitor can become a substantial aggregate CPU expense for a broad crawler.

That expense only deters an attacker when it changes the economics of the attack. In the concert-ticket example, paying a couple of dollars to bypass a challenge may still leave an attractive margin on a ticket resold for $200–$300. Signals such as an unverified IP address or suspicious request characteristics can justify harder puzzles, but increasing difficulty also penalizes legitimate users. Repeatedly refreshing a CAPTCHA that cannot be solved is an accessibility failure as well as a frustrating interaction.

For self-hosting, Mytton names Anubis, Go Away and Nepenthes as projects to consider in front of an application or in a Kubernetes deployment. He groups them under protective proxies and challenges; Anubis specifically documents configurable proof-of-work challenges. The deployment pattern places the protection layer before the application so that suspicious clients encounter a challenge before consuming the protected resource. The projects should not be assumed to implement identical mechanisms.

13:0113:13
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

13:01 · section reference included

Verify requests cryptographically

Cryptographic request attestation offers another way to establish who a client is. Mytton describes Cloudflare’s proposal to attach an HTTP message signature to an automated request so that the recipient can verify it quickly. At talk time, he characterizes the proposal as only weeks old and still developing, with an open question about how much it improves on source-IP verification. A verified identity still needs an associated policy deciding what that client may do.

Apple’s Private Access Tokens address a related problem: reducing CAPTCHA prompts through private attestation. Mytton introduces them through Privacy Pass and the Apple ecosystem. Apple’s actual requirements are supported software and a signed-in Apple ID, with checks on device legitimacy and account standing—not a paid iCloud subscription. Support includes WebKit and URLSession as well as Safari. Mytton describes limited website adoption at the time, making deployment and ecosystem support practical constraints alongside the cryptography.

15:3415:48
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

15:34 · section reference included

Connect requests across changing IP addresses

An IP address is an unstable basis for recognizing a client. Crawlers can rotate through large banks of addresses, particularly with IPv6, while retaining the same underlying client software. Fingerprinting extracts characteristics of that software’s network requests and turns them into a hash, allowing related traffic to be grouped even when its source address changes.

JA4 fingerprints TLS client characteristics. The HTTP counterpart identified in the companion material, JA4H, uses headers and other HTTP request characteristics. Their licensing differs: JA4 uses BSD 3-Clause, while JA4H’s published source uses a FoxIO license with monetization restrictions. The talk’s description of the HTTP version as proprietary should not be read as meaning its source is unavailable.

Once requests are grouped by fingerprint, a rule can act on their aggregate behavior. A client producing excessive traffic across many addresses can be blocked by its shared fingerprint instead of requiring a separate rule for every IP. A fingerprint describes client characteristics, however, not a permanent unique identity: similar stacks can share characteristics, and TLS-library updates can change the hash.

Rate limiting uses that grouping to impose a quota rather than necessarily blocking all access. The rate-limit key determines what the quota actually constrains. IP-only limits are vulnerable both to ordinary address changes and deliberate rotation.

KeyWhat the quota followsMain consideration
Source IPTraffic from one addressRotation splits activity across buckets.
Authenticated session IDActivity within a logged-in sessionRequires an authenticated session.
JA4 fingerprintTraffic sharing TLS client characteristicsGroups stacks, not unique people.

Mytton recommends a user session ID for logged-in traffic or a JA4 hash when fingerprinting supplies the grouping. The goal is to make changing addresses less effective as a way to escape the intended limit.

16:5617:17
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

16:56 · section reference included

Add defenses as the resource demands

The adoption order starts with a modest baseline: express policy through robots.txt, classify declared user agents, and verify the crawlers you intend to allow. Mytton argues that this combination is sufficient for most sites. More popular services, valuable content and scarce goods create stronger incentives to bypass that baseline, warranting additional network reputation checks, computational challenges and consideration of emerging request signatures. Fingerprinting combined with rate limits is his common destination for stronger protection.

These controls can live in application code rather than remaining an opaque infrastructure concern. Mytton’s implementation context is Arcjet, and he closes by pointing developers to a fuller writeup with examples. That companion now leads to the updated bot detection guide. The engineering task is to choose which clients may consume which resources, verify the signals supporting that decision, and enforce a cost or quota that matches the resource’s value.

18:4518:56
Suggest correction

This note stays in this page until you copy or download it. Nothing is submitted; reloading clears the draft.

18:45 · section reference included

Resources

From the talk

Updates since the talk

Read the complete timestamped transcript
  1. 0:00

    [upbeat music] Hi, everyone.

  2. 0:16

    So my name is David. I'm the founder of Arcjet. We provide a security SDK for developers. So everything I'm gonna be talking to you about today is what we've been building for the last few years, but how you can do it yourself.

  3. 0:29

    So if you haven't had bots visiting your website and felt the pain, then you might be thinking, "Well, is this really a problem?" Well, as, as you just heard in the introduction, almost fifty percent of web traffic today is automated clients, and that varies depending on the industry.

  4. 0:47

    In gaming, that's almost sixty percent of all traffic is automated, and that's before the agent revolution has really kicked off. This isn't a new problem. It's been going on since the invention of the internet, and there are bots that you want to visit your website, like Googlebot, but there are also a lot of malicious crawlers, and this

  5. 1:08

    causes a problem. The first incident you might experience is around expensive requests. And think through what happens on your website. If it's a static site, then maybe it's not doing much, um, on your infrastructure.

  6. 1:22

    But if you're generating any content from a database or you're reading some dynamic content in some way, um, then each request is gonna cost something. Particularly if you're using a serverless platform, paying per request.

  7. 1:35

    If you have huge numbers of automated clients coming in, making requests, making hundreds of thousands of requests, um, then this starts to build up as a problem, as a cost problem, um, and also, uh, being able to deal with that on your infrastructure.

  8. 1:48

    These clients can also be requesting all the assets, so downloading large files. That's gonna start eating into your bandwidth costs and eating into the available resources you have to serve legitimate users on your site.

  9. 2:02

    This can show up as a denial of service attack, so your service just might not be available to others. And even the largest website doesn't have infinite resources. Serverless means that you don't have to think about that for the most part, but what-- the way you're actually handling it is part of the billing.

  10. 2:23

    This has been a problem for, for decades. And so the real question is: well, is AI making this worse? We see complaints in the media, um, websites talking about the traffic that they're getting, and there's just an automatic assumption this is AI.

  11. 2:38

    And on the face of it, there's no real evidence that that is the case. But when you start looking into the details about the kind of requests that these sites are, are seeing, then AI is making it worse.

  12. 2:49

    So for instance, Diaspora, which is an online, um, online open source community, they saw that twenty-four percent of their traffic was from GPTBot, which is OpenAI's crawler.

  13. 3:01

    And then Read the Docs, which is, uh, an online documentation platform, um, for code, code projects. They found that by blocking all AI crawlers, they reduced their bandwidth from eight hundred gigabytes a day to two hundred gigabytes a day.

  14. 3:16

    And even Wikipedia is having this problem. They're spending up to thirty-five percent of their traffic just serving automated clients, and they're seeing this increasing significantly, um, and attributing that to AI crawlers.

  15. 3:30

    So AI is making this worse. Scrapers are coming onto sites and pulling down the content, and they're not behaving nicely. They're not doing it in a gradual way. Um, they're making hundreds of thousands of requests and just pulling down content without following the rules.

  16. 3:49

    In the old days, we had this idea of good bots and bad bots, and the challenge was always distinguishing between them.

  17. 3:56

    If you want your website to show up in a search index like Google, then Google has to know about your site. It has to visit and understand your site.

  18. 4:03

    But you get a benefit from that because you're gonna appear in the search index and you're gonna get traffic as a result. And so most people consider Google to be a good bot.

  19. 4:12

    And then there's the bad bots, which are obviously bad. Scrapers coming to your site, downloading all the images, downloading all the content, um, downloading files. It's very easy to understand that those are the bad bots.

  20. 4:24

    But in the middle we've got these AI crawlers, and sometimes they're good, sometimes they're bad. It depends on sometimes your philosophical approach to AI, but also what you want from your website.

  21. 4:36

    Because the first kinds of AI bots we were seeing were for training, just to build up the models, and in theory, there's no benefit to the site owner for that because it's just being built into the model.

  22. 4:46

    You're not necessarily getting any traffic. But things have started to change with multiple bots coming from the different AI providers. So for instance, with OpenAI, they have at least four different types of bots.

  23. 5:01

    So the first one is the OpenAI Search Bot. This is kind of classic Googlebot-type, um, crawler, which will come to your site. It will understand what's going on, and it will index it so that when someone makes a query into ChatGPT using the search functionality, you show up in OpenAI's index.

  24. 5:18

    Now, in most cases, you're gonna want that. It's going to do the same thing as Google. You're gonna appear in a search index. You're probably gonna get citations. Um, that wasn't the case at the very beginning, but now you're getting citations, and this is becoming a real source of traffic for sites and for services.

  25. 5:34

    People are getting sign-ups as a result. And so there's a win-win. It's, it's the same as, as the old Google crawlers.

  26. 5:41

    Then there's ChatGPT User, and this is a little more nuanced. It's where ChatGPT may show up to your website as a result of a real-time query that a user is making.

  27. 5:51

    Maybe you drop the actual URL into the chat and ask it to summarize the content. Um, or it's a documentation link and you want to understand how to implement something and it's going out and getting that content.

  28. 6:02

    It's not used for training.

  29. 6:04

    But it may not cite the response. But if you've given it the URL, then perhaps you're a, you're a legitimate user. And so maybe you do want that because it's actually your users making use of, of LLMs.

  30. 6:17

    And then there's GPTBot, which is the one that we saw was taking up a huge amount of, um, of traffic on Wikipedia and Diaspora, and this is the original one that is part of the training.

  31. 6:27

    It doesn't benefit you directly. You're being pou- brought into the model, um, and there's often no citation as a result. These are kind of the three crawler bots that you might see on your site.

  32. 6:38

    And then what we're seeing more of now is the computer use operator-type bots, which are acting on behalf of a real person, possibly with a web browser that's running in a VM, that is taking an action as an agent, an autonomous agent.

  33. 6:53

    And this becomes challenging to understand. Well, do you want that or not? Maybe it's a legitimate use case. Maybe the agent is doing triage of your inbox. Maybe Google would want that if it's Gmail.

  34. 7:04

    But if you've asked an agent to go out and buy 500 concert tickets so you can then go and sell them for a profit, that's probably something you don't want to allow.

  35. 7:13

    And so understanding, being able to detect these is really challenging. The OpenAI crawlers identify themselves as such. You can verify that, and so you can allow or block them.

  36. 7:24

    But something like Operator just shows up as a Chrome browser, and it's much more challenging to understand and detect that.

  37. 7:33

    So let's walk through some of the defenses that you can implement, and to decide as a site owner how you can control which kind of traffic that's coming to your site.

  38. 7:42

    So the first one of these is... It's not really a defense because it's entirely voluntary. Everyone's probably heard of robots.txt. It's how you can describe the structure of your website and tell different crawlers what you want them to do.

  39. 7:54

    You can allow or disallow. You can, um, control particular crawlers, and this gives you a good understanding of your own site to think through the steps that you want to take to allow or disallow, but it's entirely voluntary.

  40. 8:08

    Crawlers don't have to follow it, but the good ones will. Googlebot will follow this, as will all of the search crawlers. OpenAI claims to follow it and does for the most part as well.

  41. 8:17

    But for the types of bots that are causing these problems, they're not following this, and in some cases, they're actually using this to find pages on your site that you've disallowed other bots to go to and deliberately going out and getting that content.

  42. 8:31

    Even so, this is a good place to start because it helps you start to think through what you want different bots to be doing on your site.

  43. 8:40

    Every request that comes into your site is gonna identify itself. This is a required HTTP header, um, and it's just a string. It is a name that the crawler's gonna give itself, and you'll see that in your request logs.

  44. 8:55

    It's just a string because any, uh, any re-- a client can set whatever they like for this. But it's surprising how many will actually just tell you who they are, and you can, uh, you can use open source libraries, um, to detect this and create rules around it.

  45. 9:10

    At Arcjet, we've got a open source project with, um, several thousand different user agents, um, that you can download and use to build your own rules to identify who you want to access your site.

  46. 9:21

    But it's just a string in a HTTP header, and you can set it to whatever you want. And so the bad bots will just change this. They'll pretend to be Google, or they'll pretend to be Chrome.

  47. 9:30

    And so it's not always a good signal about who's actually visiting your site.

  48. 9:36

    So the next thing you can do is to verify that. If a request is made to your site and it claims to be Apple's crawler, Bing, Google, OpenAI, all of these services support verification.

  49. 9:51

    So you can look at the source IP address, and you can query those services using a reverse DNS lookup to check whether it is actually who it claims to be.

  50. 10:01

    So if you see a request coming from Google, you can ask Google, "Is this actually Google?" And they'll give you a response back saying whether it is or not.

  51. 10:09

    And this makes it quite straightforward to use the combination of the user agent string plus IP verification to check whether it is the good bots that are visiting your site and to set up some simple rules to allow those crawlers that you actually want to be on the site.

  52. 10:27

    Things start to get a bit more complicated if those signals don't provide you with sufficient information. Bot detection is not 100% accurate, and so you have to build up these layers.

  53. 10:39

    And so the next thing you can do is looking at IP addresses. The idea is to build up a pattern to understand what is normal from each IP address.

  54. 10:50

    And not just a single IP address, but the, uh, different IP address ranges, how they associate with different networks and different network operators, whether the request is coming from a data center or not, and the country-level information.

  55. 11:04

    And you can get this from various databases. Um, you have to pay for access to most of them, but there are also some free APIs you can use to query the metadata associated with a particular IP address.

  56. 11:16

    MaxMind and IPinfo are two more popular ones. And you want to be looking at things like, well, where's the traffic coming from and what's the association with the network?

  57. 11:25

    Is this coming from a VPN or a proxy? Is it a residential or a mobile IP address? And last year, 12% of all bot traffic that hit the Cloudflare network was from the AWS network.

  58. 11:40

    And so you can start to ask yourself, well, are the normal users of our site and application going to come from a data center? Maybe if you're allowing crawlers on your site, then that's ex- uh, that's expected.

  59. 11:54

    But if you have a sign-up form that you're expecting only humans to submit, then it's unlikely that a request that's coming from a data center IP address is gonna be traffic that you want to accept.

  60. 12:07

    The challenge we're looking at geodata, like blocking a single country, for instance, um, is that the geodata's notoriously inaccurate and has become more inaccurate over time as people are using satellite and cellphone connectivity, 5G, because the IP address will be geolocated to the owner of the IP rather than necessarily the u- the user of it.

  61. 12:29

    And also, even when the database is saying that the IP address is coming from a residential network, there are proxy services that you can just buy access to which will route your traffic through those residential, um, networks to appear like it's coming from a home ISP or a mobile device.

  62. 12:48

    So you can't always trust these, and you have to build up signals and build your own database to understand where this traffic is coming from and what the likelihood is that it's an automated client.

  63. 13:01

    CAPTCHAs are the standard thing that we've been using, um, now for, uh, decades to try and distinguish between humans and automated clients, solving puzzles, um, moving things around on the screen.

  64. 13:13

    But it's becoming increasingly easy for AI to solve those. Putting them into an LM or downloading the audio version and transcribing it can be done in just a couple of seconds, and it's trivial and cheap to breach these kinds of defenses.

  65. 13:32

    There are newer approaches to this. Proof of work, which has come from the crypto, um, side of things, means that you require a computer to do certain number of calculations, uh, and provide the answer to a, to a puzzle before they can access the resource.

  66. 13:49

    And this usually takes a certain amount of time. It costs CPU time. And on an individual basis on your laptop or on your phone, it might take a second or two to calculate it, and it makes no real difference to an individual.

  67. 14:02

    But if you have a crawler that's going to tens of thousands or millions of websites and is having to solve this puzzle every single time, it becomes very expensive to do that.

  68. 14:12

    And so deploying these proof of work options on your website can be a way to, um, to prevent those crawlers.

  69. 14:19

    But then it becomes a question of incentives. So if you're crawling millions of websites, then maybe that is a, a good defense. But if we go back to that ticket example, if it costs someone a couple of dollars to solve a CAPTCHA or to solve a proof of work, but they're then going to sell a ticket for

  70. 14:36

    $200 or $300, uh, the profit is still there. And so these may not even be a defense against certain types of, um, of attacks.

  71. 14:46

    You can scale the difficulty, so if you bring in all these different signals and see that something is coming from an unverified IP address and, um, has suspicious, um, suspicious, uh, characteristics, then maybe you could give them a harder puzzle.

  72. 14:59

    But then you start to have accessibility problems, and I'm sure we've all seen those really annoying CAPTCHAs that you can't solve, and you have to keep refreshing. Um, that becomes a problem as well.

  73. 15:12

    There are a couple of interesting open source projects that implement these. Anubis is a good one, uh, Go Away, and Nepenthes. These are all proxies that you can install on the Kubernetes cluster, um, or put them in front of your, your application.

  74. 15:24

    You can run it yourself, and it will implement these proof of work problems and put it in front of the users that it thinks are suspicious.

  75. 15:34

    And there are also some emerging standards around introducing signatures into requests because what we're trying to do is to prove that a particular client is who they say it is and is who you want to be on the website.

  76. 15:48

    Now, Cloudflare has suggested this idea of HTTP message signatures for automated clients, where every request will include a cryptographic signature which you can then verify very quickly, and then you can understand which, um, which client is coming to your site.

  77. 16:03

    This has only just been announced a couple of weeks ago, so it's still being developed. There's some questions around whether it's any better than just verifying the IP address, but it's a way of verifying automated clients.

  78. 16:15

    And then a couple years ago, Apple announced private access tokens, um, and what they called a privacy pass, which allowed website owners to verify that a request was coming from a browser that was owned by an iCloud subscriber.

  79. 16:31

    This has been implemented across all Apple devices. Um, if you're using Safari, this is on, um, and it will reduce the number of CAPTCHAs that you might see because you can verify that someone's actually a paying subscriber to iCloud.

  80. 16:43

    But it's had limited adoption elsewhere. Not many sites are using it, um, and it's only on the Apple ecosystem, even though it's a, a, it's almost an approved standard.

  81. 16:56

    And then we have to implement fingerprints as well. So fingerprinting is looking at the network requests to generate a hash to be able to identify that client because it's quite trivial to change the IP address that your requests are coming from, and you'll often see crawlers using banks of tens or hundreds of thousands of different IP addresses,

  82. 17:17

    particularly with IPv6, which means implementing, um, signatures based just on an IP address isn't sufficient. But the client stays the same. The client characteristics stay the same across multiple requests, and you can build up a fingerprint of that.

  83. 17:33

    This is the open source J4 hash, which is based on the TLS fingerprint, looking at the network level, um, and looking at the configuration of SSL.

  84. 17:43

    And then there's a proprietary version on HTTP, which is looking at headers, um, and the different headers that are sent with a client and the characteristics of an HTTP request to build up a fingerprint.

  85. 17:54

    And then you can use those fingerprints as part of your block rules. So you could look at all the hundreds of thousands of requests coming from a single fingerprint.

  86. 18:01

    You could just block that fingerprint regardless of how many IP addresses it's coming across.

  87. 18:10

    And then rate limiting is used in conjunction with a fingerprint. 'Cause once you can fingerprint the client, you can apply quotas or a limit to it. And the key is really important there.

  88. 18:19

    You can't just rate limit on an IP address, um, because people have different IPs. It changes all the time, and then for malicious crawlers, they can just change them themselves.

  89. 18:28

    And so keying off user session ID is a good way to do it if the user's logged in and you want to apply your rate limits, or if you've got the, um, the fingerprint, the J4, um, hash, you can implement rate limits on that.

  90. 18:45

    So these are the eight defenses. Robots.txt is where you start. It's not where you finish though, because it's not going to prevent all the bots. It's a voluntary standard.

  91. 18:56

    It's where you start because it helps with the, the good bots. At the very least, you need to be looking at user agents. There are various open source options for looking at that and setting up rules, and then verifying that the user agent for clients that you actually want on your site are the ones that are actually

  92. 19:12

    making the requests. That gets you most of the way. For most sites, that will deal with everything you need. But for the more popular ones or sites with particularly, um, interesting resources or things that m- that people might want to buy lots, lots of numbers of or that are in restricted quantities, you need to go further looking

  93. 19:31

    at IP reputation, setting up proof of work, considering these experimental HTTP signatures, and certainly the fingerprint side of things is where most people land in combination with the rate limits.

  94. 19:45

    You can implement all these yourselves in code.

  95. 19:48

    That's what we do at Arcjet. There's a much more detailed writeup of this talk on, uh, the blog that I just published earlier today. So if you have a look at blog.arcjet.com, there's a full writeup of this talk with much more detailed examples.

  96. 20:01

    I'm happy to answer any questions via email, and we also have a booth down in the expo. But thank you very much. [outro music]