跳转到内容
搜索文档

阻止恶意机器人,同时允许合法流量 (Free、Pro 和 Business)

最后更新 查看 MarkdownAgent 设置

抵御恶意机器人流量的正确防御方法取决于您网站上的流量模式以及您的计划。本指南介绍了一种使用 Cloudflare 机器人、Cloudflare 应用程序安全(也称为 Web 应用程序防火墙或 WAF)和 Turnstile 的分层方法,从基线保护到有针对性的自定义规则。核心工作流程使用 Free、Pro 和 Business 计划中的功能,并包含针对 Enterprise 选项的提示。

查看您的机器人流量

在更改任何机器人设置之前,请查看您的流量数据,以了解机器人在您网站上的活动情况。

查找您的机器人分析

机器人分析会向您显示自动流量在总流量中所占的比例、机器人目标的页面以及 Cloudflare 对每个请求的评分。

  1. 在 Cloudflare 仪表板中,转到 Analytics(分析) 页面。

    Go to Analytics ↗
  2. 选择 Bot analysis(机器人分析) 选项卡。

  1. 登录 Cloudflare 仪表板 ↗ 并选择您的账户和域。
  2. 转到 Security(安全性) > Bots(机器人)。

查看以下内容:

  • 机器人分数分布图:分数越接近 1,表示是自动流量。分数越接近 99,表示是人类流量。
  • 请求最多的路径:哪些端点接收到最多的机器人流量。登录页面、API 端点和结账流程是常见的目标。
  • 流量模式:低分流量激增、出现大量的特定用户代理或请求在地理位置上集中,这些都可能表明机器人活动值得调查。

了解机器人类别

Cloudflare 根据机器人评分和验证状态将机器人流量分为以下类别:

  • 已验证机器人(Verified bots):Cloudflare 已确认为合法的爬虫和服务,例如 Googlebot、Bingbot 和正常运行时间监控器。Cloudflare 维护一个已验证机器人列表,并设有严格要求。
  • 自动化(Automated)(评分 1):Cloudflare 高度确定该请求为自动化请求。
  • Likely automated(可能自动化)(评分 2-29):可能是机器人。此类别与"自动化"类别是安全规则的主要目标对象,包括抓取工具、凭据填充工具和垃圾信息提交者。
  • 可能是真人(Likely human)(评分 30-99):这些请求似乎来自真实用户。请勿对此流量发起质询或进行封锁。

使用 Bot Fight Mode 阻止自动流量

Bot Fight Mode 识别与已知机器人模式相匹配的请求,并发出计算质询。它可以减少整个站点的自动流量,而无需您编写任何规则。

Bot Fight Mode 的作用

Bot Fight Mode 包含在 Free 计划中。启用后,它会:

  • 识别符合已知机器人模式的流量
  • 响应这些机器人发出需要大量计算的质询
  • 保护整个域,没有端点限制
  • 无法通过自定义规则进行自定义、调整或重新配置
  • 无法通过自定义规则“跳过”操作来绕过。如果 Bot Fight Mode 质询了您想要允许的请求,您可以关闭 Bot Fight Mode 或升级到 Super Bot Fight Mode 以获得更精细的控制。

有关详细信息,请参阅 Bot Fight Mode 注意事项。

打开 Bot Fight Mode (Free 计划)

  1. 在 Cloudflare 仪表板中,转到 Security settings(安全设置) 页面。

    Go to Settings ↗
  2. 按 Bot traffic(机器人流量) 筛选。

  3. 转到 Bot fight mode。

  4. 开启 Bot fight mode。

  1. 登录 Cloudflare 仪表板 ↗,选择您的账户和域名。
  2. 转到 Security(安全性) > Bots(机器人)。
  3. 对于 Bot Fight Mode,选择 On(开启)。

启用 Super Bot Fight Mode (Pro、Business 和 Enterprise)

Super Bot Fight Mode 添加了经验证的机器人允许列表、按类别的操作、静态资源保护和 JavaScript 检测。

  1. 在 Cloudflare 仪表板中,转到 Security settings(安全设置) 页面。

    Go to Settings ↗
  2. 按 Bot traffic(机器人流量) 筛选。

  3. 转到 Super Bot fight mode(超级 Bot 拦截模式)。

  4. 开启 Super Bot fight mode(超级 Bot 拦截模式)。

  5. 通过选择关联的编辑图标,选择您的域名应如何响应各种类型的流量:

  1. 登录 Cloudflare 仪表板 ↗,选择您的账户和域名。

  2. 转到 Security(安全性) > Bots(机器人)。

  3. 选择 Configure Super Bot Fight Mode(配置 Super Bot Fight Mode)。

  4. 选择您的域名应如何响应各种类型的流量:

保护表单免受自动滥用

Turnstile 和应用程序安全速率限制规则以不同的方式保护表单端点,且最好协同使用。

Turnstile 与速率限制比较

Turnstile 在疑似机器人提交表单(登录、注册、联系或结账)之前向其发起质询,且不会向访客显示验证码 (CAPTCHA)。它可以嵌入到任何网站中,而无需将流量发送至 Cloudflare。当您需要质询自动表单提交时,请使用 Turnstile。

速率限制功能使您能够为符合表达式的请求设定限速阈值,以及在达到这些限额时应执行的操作。请利用速率限制功能来保护端点免受滥用(比如对登录页面的暴力破解攻击,或是来自单一客户端的过量 API 调用)。

两者结合提供了最强的覆盖范围。Turnstile 在表单级别对自动提交提出质询。速率限制捕获绕过或未遇到表单的大量攻击,例如绕过客户端小组件直接向端点发送的 POST 请求。

将 Turnstile 添加到表单

添加 Turnstile 涉及三个步骤:创建小组件、添加客户端代码段,以及在服务器上验证令牌。

1. 创建 Turnstile 小组件

Turnstile 是在账户级别配置的。

  1. 在 Cloudflare 仪表板中,转到 Turnstile 页面。

    Go to Turnstile ↗
  2. 选择 Add widget(添加小组件)。

  3. 填写所需信息:

    • Widget name(小组件名称):您的小组件的描述性名称。
    • Hostname management(主机名管理):将使用该小组件的域。
    • Widget mode(小组件模式):从 Managed(托管)、Non-Interactive(非交互式)或 Invisible(不可见)中进行选择。
  4. (可选)为单页应用程序配置 Pre-clearance support(预清除支持)。

  5. 选择 Create(创建) 以保存您的小组件。

  6. 复制您的 sitekey 和 secret key,并妥善保存 secret key。

在接下来的步骤中,您同时需要站点密钥和私钥。

2. 添加客户端代码段

将 Turnstile 脚本和小组件容器添加到您的表单 HTML:

<script
	src="https://challenges.cloudflare.com/turnstile/v0/api.js"
	async
	defer
></script>

<form action="/submit" method="POST">
	<!-- 您的现有表单字段 -->
	<div class="cf-turnstile" data-sitekey="<YOUR_SITE_KEY>"></div>
	<button type="submit">提交</button>
</form>

将 <YOUR_SITE_KEY> 替换为您在上一步中取得的站点密钥。该小组件将渲染于 div 之内,并在访问者通过质询时产生一个令牌。

3. 在服务器上验证令牌

在处理表单提交之前,将令牌发送到 Turnstile siteverify 端点,以确认访问者已通过质询:

curl https://challenges.cloudflare.com/turnstile/v0/siteverify \
  --header "Content-Type: application/json" \
  --data '{
  "secret": "<YOUR_SECRET_KEY>",
  "response": "<TURNSTILE_RESPONSE_TOKEN>"
}'

将 <YOUR_SECRET_KEY> 替换为您的私钥,将 <TURNSTILE_RESPONSE_TOKEN> 替换为表单提交中的 cf-turnstile-response 值。该端点返回一个带有 success 字段的 JSON 对象。仅当 success 为 true 时,才处理表单提交。

有关完整集成细节,请参考 Turnstile 入门。

通过速率限制来限制表单端点上的请求量

对于登录端点,分层的速率限制方法与 Turnstile 结合使用效果很好。以下来自速率限制最佳实践的示例展示了根据失败尝试次数升级响应的两个规则。您可以根据网站的流量模式调整阈值。

**短时间窗口规则:**对在短时间窗口内发送过多失败登录请求的 IP 发起质询。

  1. 在 Cloudflare 仪表板中,转到 Security(安全性) > Security rules(安全规则)。

    Go to Security rules ↗
  2. 选择 Create rule(创建规则) > Rate limiting rules(速率限制规则)。

  3. 在 Rule name(规则名称) 中输入一个描述性名称。

  4. 在 If incoming requests match(如果传入请求匹配) 下,选择 Edit expression(编辑表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST"

  5. 在 With the same characteristics(具有相同特征的内容) 下,选择 IP。

  6. 启用 Use custom counting expression(使用自定义计数表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}

  7. 在 When rate exceeds(速率超过此数值时) 下,输入每 1 分钟 4 个请求。

  8. 在 Then take action(接着采取措施) 下,选择 托管质询。

  9. 选择 Deploy(部署)。

  1. 登录 Cloudflare 仪表板 ↗,然后选择您的账户和域。
  2. 转到 Security(安全性) > WAF > Rate limiting rules(速率限制规则)。
  3. 选择 Create rule(创建规则)。
  4. 在 Rule name(规则名称) 中输入一个描述性名称。
  5. 在 If incoming requests match(如果传入请求匹配) 下,选择 Edit expression(编辑表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST"
  6. 在 With the same characteristics(具有相同特征的内容) 下,选择 IP。
  7. 启用 Use custom counting expression(使用自定义计数表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}
  8. 在 When rate exceeds(速率超过此数值时) 下,输入每 1 分钟 4 个请求。
  9. 在 Then take action(接着采取措施) 下,选择 托管质询。
  10. 选择 Deploy(部署)。

**长时间窗口规则:**阻止在较长时间段内累积失败登录尝试的 IP。

  1. 在 Cloudflare 仪表板中,转到 Security(安全性) > Security rules(安全规则)。

    Go to Security rules ↗
  2. 选择 Create rule(创建规则) > Rate limiting rules(速率限制规则)。

  3. 在 Rule name(规则名称) 中输入一个描述性名称。

  4. 在 If incoming requests match(如果传入请求匹配) 下,选择 Edit expression(编辑表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST"

  5. 在 With the same characteristics(具有相同特征的内容) 下,选择 IP。

  6. 启用 Use custom counting expression(使用自定义计数表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}

  7. 在 When rate exceeds(速率超过此数值时) 下,输入每 1 小时 20 个请求。

  8. 在 Then take action(接着采取措施) 下,选择 阻止,并将持续时间设置为 1 天。

  9. 选择 Deploy(部署)。

  1. 登录 Cloudflare 仪表板 ↗,然后选择您的账户和域。
  2. 转到 Security(安全性) > WAF > Rate limiting rules(速率限制规则)。
  3. 选择 Create rule(创建规则)。
  4. 在 Rule name(规则名称) 中输入一个描述性名称。
  5. 在 If incoming requests match(如果传入请求匹配) 下,选择 Edit expression(编辑表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST"
  6. 在 With the same characteristics(具有相同特征的内容) 下,选择 IP。
  7. 启用 Use custom counting expression(使用自定义计数表达式) 并输入:http.request.uri.path eq "/login" and http.request.method eq "POST" and http.response.code in {401 403}
  8. 在 When rate exceeds(速率超过此数值时) 下,输入每 1 小时 20 个请求。
  9. 在 Then take action(接着采取措施) 下,选择 阻止,并将持续时间设置为 1 天。
  10. 选择 Deploy(部署)。

此模式使用的计数表达式仅统计返回身份验证失败代码的 POST 请求。初次尝试即成功登录的合法用户绝不会触发该规则。请在安全事件中检查结果,以确保阈值不会误判合法用户。

有关包含三个规则的完整分层凭证填充示例,请参考速率限制最佳实践。

通过自定义规则和速率限制针对机器人模式

应用程序安全自定义规则和速率限制规则使您能够精确定位内置机器人保护未能捕获的特定流量模式。Cloudflare 将检测(为流量评分)与缓解(根据这些评分采取操作)区分开来。您可编写引用检测信号的规则以决定采取何种操作。

阻止缺少标头或标头可疑的请求

合法的浏览器通常会发送诸如 User-Agent、Accept 和 Accept-Language 这样的标头。许多机器人会省略这些标头或发送非浏览器值。针对带有空标头或可疑标头请求的自定义规则,可捕获那些规避基于评分检测的机器人。

在创建自定义规则之前,请查看 Security(安全性) > Settings(设置) 中(按“机器人流量”过滤)的内置机器人设置。这些设置可处理常见的情况,例如阻止 AI 爬虫、质询自动流量以及允许已验证机器人,而无需您编写表达式。有关内置设置的完整列表,请参考质询不良机器人。

如果内置设置不能满足您的需求,请创建自定义规则。首先,为已验证的机器人创建一个例外,以便它们在您部署任何阻止规则之前受到保护。

导航到自定义规则,然后创建这两条规则:

  1. 在 Cloudflare 仪表板中,转到 Security(安全性) > Security rules(安全规则)。

    Go to Security rules ↗
  2. 选择 Create rule(创建规则) > Custom rules(自定义规则)。

  1. 登录 Cloudflare 仪表板 ↗,然后选择您的账户和域。
  2. 转到 Security(安全性) > WAF > Custom rules(自定义规则)。
  3. 选择 Create rule(创建规则)。

首先,创建一个已验证机器人例外:

  1. 在 Rule name(规则名称) 中输入一个描述性名称。
  2. 在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:(cf.client.bot)
  3. 在 Then take action(接着采取措施) 下,从 Choose action(选择操作) 下拉菜单中选择 跳过。然后选择 All remaining custom rules(所有剩余自定义规则)。
  4. 在 Place at(放置于) 下,从 Select order(选择顺序) 下拉菜单中选择 最前,以便此规则在任何阻止规则之前执行。
  5. 选择 Deploy(部署)。

这可确保已验证的机器人(搜索引擎爬虫、监控服务)绕过您的自定义规则。如果您有发送自动流量的内部 API、合作伙伴集成或监控工具,请在部署阻止规则之前为其 IP 地址或用户代理创建其他跳过规则。在安全事件中审查预期的自动流量,以识别要加入允许列表的内容。

然后,创建一条阻止规则:

  1. 选择 Create rule(创建规则)。
  2. 在 Rule name(规则名称) 中输入一个描述性名称。
  3. 在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:(http.request.uri.path eq "/login" and http.request.method eq "POST")
  4. 在 Then take action(接着采取措施) 下,从 Choose action(选择操作) 下拉菜单中选择 托管质询。
  5. 在 Place at(放置于) 下,将 Select order(选择顺序) 下拉菜单保留为 最后。这会将规则放置在已验证机器人例外之后。
  6. 选择 Deploy(部署)。
  7. 在安全事件中审查结果。如果该规则仅匹配机器人流量,请编辑该规则,并将操作从 托管质询 更改为 阻止。

有关其他自定义规则选项,包括可视化字段生成器,请参考在仪表板中创建自定义规则。

如果您的机器人流量集中在没有真实用户的国家/地区,您可以将地理过滤器与上述规则结合使用。将 ip.src.country 添加到您的表达式中,以将规则限制在特定区域。有关示例,请参考按地理位置阻止流量。

采用速率限制保护高频路径

除了表单端点外,机器人还会锁定结账流程、API 端点以及其他高价值路径。速率限制规则能够限制单个客户端在时间窗口内向这些路径发起请求的次数上限。

以下示例针对结账端点创立了一条速率限制规则。您可依您的网站状况对路径、速率及操作加以调整。

  1. 在 Cloudflare 仪表板中,转到 Security(安全性) > Security rules(安全规则)。

    Go to Security rules ↗
  2. 选择 Create rule(创建规则) > Rate limiting rules(速率限制规则)。

  3. 在 Rule name(规则名称) 中输入一个描述性名称。

  4. 在 If incoming requests match(如果传入请求匹配) 下,选择 Edit expression(编辑表达式) 并输入:http.request.uri.path eq "/api/checkout" and http.request.method eq "POST"

  5. 在 With the same characteristics(具有相同特征的内容) 下,选择 IP。

  6. 在 When rate exceeds(速率超过此数值时) 下,输入每 1 分钟 10 个请求。

  7. 在 Then take action(接着采取措施) 下,选择 托管质询。

  8. 选择 Deploy(部署)。

  9. 在安全事件中审查结果。如果该规则仅匹配机器人流量,则在需要时编辑规则并将操作更改为 阻止。

  1. 登录 Cloudflare 仪表板 ↗,然后选择您的账户和域。
  2. 转到 Security(安全性) > WAF > Rate limiting rules(速率限制规则)。
  3. 选择 Create rule(创建规则)。
  4. 在 Rule name(规则名称) 中输入一个描述性名称。
  5. 在 If incoming requests match(如果传入请求匹配) 下,选择 Edit expression(编辑表达式) 并输入:http.request.uri.path eq "/api/checkout" and http.request.method eq "POST"
  6. 在 With the same characteristics(具有相同特征的内容) 下,选择 IP。
  7. 在 When rate exceeds(速率超过此数值时) 下,输入每 1 分钟 10 个请求。
  8. 在 Then take action(接着采取措施) 下,选择 托管质询。
  9. 选择 Deploy(部署)。
  10. 在安全事件中审查结果。如果该规则仅匹配机器人流量,则在需要时编辑规则并将操作更改为 阻止。

有关其他模式和阈值,请参考速率限制最佳实践。

验证并调整您的规则

部署机器人保护规则后,使用安全事件来验证它们是否按预期工作,并根据结果调整阈值。

检查安全事件

安全事件显示了 Cloudflare 安全产品所采取操作或予以标记的请求,其中包括阻止、质询和标记。

  1. 在 Cloudflare 仪表板中,转到 Analytics(分析) 页面。

    Go to Analytics ↗
  2. 选择 Events(事件) 选项卡。

  1. 在 Cloudflare 仪表板中,转到 Security(安全性) > Events(事件)。

查看 Sampled logs(采样日志) 以检查各个请求。每个日志条目都显示采取的操作、触发的规则、源 IP、用户代理、URI 路径和国家/地区。可用的仪表板部分因计划而异。请参考您的计划功能的安全事件可用性。

查找误报(被您的规则错误质询或阻止的合法流量)。常见迹象包括:

  • 来自已知监控服务或支付处理器的请求出现在被阻止事件中
  • 与合法浏览器匹配但收到质询的用户代理
  • 来自您拥有真实用户的国家/地区的大量受质询请求

对于使用“托管质询”操作的规则,请查看质询解决率 (CSR)。CSR 较低通常表示该规则有效地过滤了自动流量,而不是合法用户。

Bot Fight Mode 和 Super Bot Fight Mode 在设计上就是积极主动的。误报在意料之中,尤其是在开启它们后的头几天。两者之间的关键区别在于您处理例外情况的方式:

  • Bot Fight Mode (Free) 无法通过自定义规则跳过操作绕过。您可以关闭 Bot Fight Mode 或升级到 Super Bot Fight Mode 以获得更多控制权。
  • Super Bot Fight Mode (Pro 及以上) 可以通过使用跳过操作的自定义规则绕过,从而使您能够更灵活地创建例外。

有关处理误报的更多信息,请参考误报。

调整您的规则

查看安全事件后,根据结果调整您的规则。

情况 1:您的监控工具或服务被阻止。

内部监控工具、运行状况检查服务或合作伙伴 API 会出现在受阻止事件中。修复方法取决于阻止它们的功能:

  • 如果 Super Bot Fight Mode (Pro 及以上) 正在阻止流量,请创建一个包含跳过操作的自定义规则,匹配该工具的 IP 地址或用户代理:

    1. 转到 Security rules(安全规则) 页面。

      Go to Security rules ↗
    2. 选择 Create rule(创建规则) > Custom rules(自定义规则)。

    3. 输入一个描述性名称。

    4. 在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:(ip.src eq 192.0.2.1)(替换为您工具的 IP 地址)。

    5. 在 Then take action(接着采取措施) 下,选择 跳过。然后选择 All Super Bot Fight Mode rules(所有 Super Bot Fight Mode 规则)。

    6. 选择 Deploy(部署)。

  • 如果 Bot Fight Mode (Free) 阻止了流量,请关闭 Bot Fight Mode 或升级到 Super Bot Fight Mode 以获得精确的例外规则。

有关跳过操作配置的详细信息,请参阅配置带有跳过操作的规则。

情况 2:恶意流量仍旧能够通过。

机器人活动在您的当前规则未捕捉到的安全事件中出现。对于保持在速率限制之下或规避单信号规则的机器人,需要结合多个信号。例如,对不是来自经过验证的机器人的 POST 访问 /login 的请求发出质询:

  1. 在 Cloudflare 仪表板中,转到 Security(安全性) > Security rules(安全规则)。

    Go to Security rules ↗
  2. 选择 Create rule(创建规则) > Custom rules(自定义规则)。

  3. 输入一个描述性名称。

  4. 在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:

    (http.request.uri.path eq "/login" and http.request.method eq "POST" and not cf.client.bot)
  5. 在 Then take action(接着采取措施) 下,选择 托管质询。

  6. 选择 Deploy(部署)。

  7. 在安全事件中查看结果。如果该规则仅匹配机器人流量,请将操作更改为 阻止。

  1. 登录 Cloudflare 仪表板 ↗,然后选择您的账户和域。

  2. 转到 Security(安全性) > WAF > Custom rules(自定义规则)。

  3. 选择 Create rule(创建规则)。

  4. 输入一个描述性名称。

  5. 在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:

    (http.request.uri.path eq "/login" and http.request.method eq "POST" and not cf.client.bot)
  6. 在 Then take action(接着采取措施) 下,选择 托管质询。

  7. 选择 Deploy(部署)。

  8. 在安全事件中查看结果。如果该规则仅匹配机器人流量,请将操作更改为 阻止。

有关更多表达式字段和示例,请参考自定义规则用例。

如果机器人的请求量保持在您的速率限制阈值以下,请编辑速率限制规则并减少请求次数或缩短时间窗口。

相关资源

Bots(机器人)

应用程序安全

Turnstile

  • Turnstile — 供表单和用户交互应用,且注重保护隐私的免费质询功能

这篇文档对您有帮助吗?