如果您的网站有登录页面,您就需要决定如何验证访问者是否是人类、如何严格限制失败的尝试,以及要阻止哪些请求模式。本指南包含五个阶段:强制执行 HTTPS,启用机器人保护,在登录表单中添加 Turnstile,为可疑模式创建应用程序安全速率限制规则和自定义规则,并使用 SSL/TLS 传输安全和 Cloudflare Bot 解决方案监控正在进行的攻击。核心工作流程涵盖 Free、Pro 和 Business 计划上可用的功能。Enterprise 功能(如泄露凭据自定义检测位置和 Bot Management 自定义规则)会以提示说明的形式包含在内。
在客户端和源服务器之间的网络路径上,任何人都能看见通过纯 HTTP 发送的凭据。Cloudflare SSL/TLS 提供了两项强制执行 HTTPS 连接的设置:始终使用 HTTPS 和 HTTP 严格传输安全 (HSTS)。要更好地控制您的域接受哪些加密标准,请参阅 密码套件。
“始终使用 HTTPS”会将所有的访问者请求从 http 重定向到 https,适用于所有子域和主机。
要在仪表板中启用 Always Use HTTPS(始终使用 HTTPS):
-
在 Cloudflare 仪表板中,前往 SSL/TLS Overview(SSL/TLS 概览) 页面。
Go to Overview ↗ -
确保您的 SSL/TLS encryption mode(SSL/TLS 加密模式) 未设置为 Off(关闭)。将加密模式设置为 Off(关闭) 时,Cloudflare 仪表板中将不会显示 Always Use HTTPS(始终使用 HTTPS) 选项。
-
前往 Edge Certificates(边缘证书) ↗ 页面。
-
开启 Always Use HTTPS(始终使用 HTTPS)。
要使用 API 启用或禁用 Always Use HTTPS(始终使用 HTTPS):
- 确保您的 SSL/TLS encryption mode 未设置为 Off。
- 发送
PATCH请求,URI 路径中的设置名称为always_use_https,value参数设置为您所需的值("on"或"off")。
Cloudflare 为所有计划提供机器人保护,且各项功能因计划层级而异。在配置专门针对登录的规则之前开启机器人保护,能够让您在整个域中获得抵御自动流量的基本过滤能力。
Bot Fight Mode 对与已知机器人模式匹配的请求发起质询。它适用于您的域上的所有流量,且无法使用例外情况或特定路径规则进行自定义。
-
在 Cloudflare 仪表板中,转到 Security settings(安全设置) 页面。
Go to Settings ↗ -
按 Bot traffic(机器人流量) 筛选。
-
转到 Bot fight mode。
-
开启 Bot fight mode。
- 登录 Cloudflare 仪表板 ↗,选择您的账户和域名。
- 转到 Security(安全性) > Bots(机器人)。
- 对于 Bot Fight Mode,选择 On(开启)。
Super Bot Fight Mode 可识别匹配已知机器人模式的流量,能质询或阻止机器人,还可为静态资源提供保护。您可以为每一个机器人分组配置独立的操作:确定属于自动产生的流量、可能属于自动产生的流量 以及 经过验证的机器人。此外,您还可以使用带有 Skip(跳过)操作的应用程序安全自定义规则,配置例外情况。
-
在 Cloudflare 仪表板中,转到 Security settings(安全设置) 页面。
Go to Settings ↗ -
按 Bot traffic(机器人流量) 筛选。
-
转到 Super Bot fight mode(超级 Bot 拦截模式)。
-
开启 Super Bot fight mode(超级 Bot 拦截模式)。
-
通过选择关联的编辑图标,选择您的域名应如何响应各种类型的流量:
- 有关已验证机器人的更多详情,请参阅已验证机器人。
- 有关支持的文件类型的更多详情,请参阅静态资源保护。
- 有关不可见代码注入的更多详情,请参阅 JavaScript 检测。
- 有关 WordPress 优化的更多详情,请参阅面向 WordPress 的 Super Bot Fight Mode。
-
登录 Cloudflare 仪表板 ↗,选择您的账户和域名。
-
转到 Security(安全性) > Bots(机器人)。
-
选择 Configure Super Bot Fight Mode(配置 Super Bot Fight Mode)。
-
选择您的域名应如何响应各种类型的流量:
- 有关已验证机器人的更多详情,请参阅已验证机器人。
- 有关支持的文件类型的更多详情,请参阅静态资源保护。
- 有关不可见代码注入的更多详情,请参阅 JavaScript 检测。
- 有关 WordPress 优化的更多详情,请参阅面向 WordPress 的 Super Bot Fight Mode。
以下是保护登录请求的建议起始设置,请根据流量模式进行调整。
- Definitely automated(确定属于自动产生的流量):Managed Challenge(托管质询)。在通过安全事件确认不会影响合法流量后,再改为 Block(阻止)。
- Likely automated(可能属于自动产生的流量):Managed Challenge(托管质询)。
- Verified bots(经过验证的机器人):Allow(允许)。
自定义规则在 Super Bot Fight Mode 之前运行。要为特定路径或流量创建例外,请创建带有 Skip 操作 的自定义规则。Skip 操作允许请求绕过 Super Bot Fight Mode 而不终止请求,从而继续通过后续安全检查。
以下两种工具可保护登录端点免受自动化滥用,且各自覆盖不同的攻击向量:
- Turnstile 在不显示 CAPTCHA 的情况下验证访问者是否为人类。它可以嵌入任何网站,无需将流量发送到 Cloudflare。使用 Turnstile 质询自动化的表单提交。
- 应用程序安全速率限制规则 为匹配表达式的请求定义速率限制,以及达到限制时执行的操作。使用速率限制保护登录端点免受暴力破解等滥用行为。
两者结合可提供最强防护。Turnstile 在表单层面质询自动化提交。速率限制可捕获绕过或未遇到表单的高流量攻击,例如直接向端点发送的 POST 请求。
实施 Turnstile 包括三个步骤:创建小组件、将客户端代码片段添加到登录表单,以及在服务器上验证令牌。Turnstile 支持多种呈现方式,包括显式和隐式呈现。如果您无法控制登录表单源代码,也可以使用 Cloudflare Worker 将 Turnstile 注入 HTML。
Turnstile 在账户级别配置。
-
在 Cloudflare 仪表板中,转到 Turnstile 页面。
Go to Turnstile ↗ -
选择 Add widget(添加小组件)。
-
填写所需信息:
- Widget name(小组件名称):您的小组件的描述性名称。
- Hostname management(主机名管理):将使用该小组件的域。
- Widget mode(小组件模式):从 Managed(托管)、Non-Interactive(非交互式)或 Invisible(不可见)中进行选择。
-
(可选)为单页应用程序配置 Pre-clearance support(预清除支持)。
-
选择 Create(创建) 以保存您的小组件。
-
复制您的 sitekey 和 secret key,并妥善保存 secret key。
后续步骤需要 sitekey 和 secret key。
将 Turnstile 脚本和小组件容器添加到登录表单。将 <YOUR-SITE-KEY> 替换为上一步中的 sitekey。
<form id="login-form">
<input type="text" id="username" placeholder="Username" required />
<input type="password" id="password" placeholder="Password" autocomplete="off" required />
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div>
<button type="submit">Log in</button>
</form>
<script
src="https://challenges.cloudflare.com/turnstile/v0/api.js"
async
defer
></script>小组件在 div 内渲染,访问者通过质询后会生成令牌。提交表单时,表单数据中会包含 cf-turnstile-response 令牌。
在处理表单提交之前,将令牌发送到 Turnstile siteverify 端点,以确认访问者通过了质询。
const SECRET_KEY = "<YOUR-SECRET-KEY>";
async function validateTurnstile(token, remoteip) {
try {
const response = await fetch(
"https://challenges.cloudflare.com/turnstile/v0/siteverify",
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
secret: SECRET_KEY,
response: token,
remoteip: remoteip,
}),
},
);
const result = await response.json();
return result;
} catch (error) {
console.error("Turnstile validation error:", error);
return { success: false, "error-codes": ["internal-error"] };
}
}将 "<YOUR-SECRET-KEY>" 替换为您的 Turnstile secret key。端点返回包含 success 字段的 JSON 对象。仅当 success 为 true 时才处理表单提交。
如需额外的欺诈检测,Turnstile 支持 Ephemeral IDs,可为每个访问者会话提供唯一临时标识符,且不会存储个人数据。
有关完整响应格式、错误代码和其他语言示例,请参阅验证令牌。
Turnstile 提供测试 site key,可在不调用 Siteverify API 的情况下返回可预测结果。
- Always passes(始终通过):使用 site key
1x00000000000000000000AA和 secret key1x0000000000000000000000000000000AA模拟成功质询。 - Always blocks(始终阻止):使用 site key
2x00000000000000000000AB和 secret key2x0000000000000000000000000000000AA模拟失败质询。 - Forces interactive challenge(强制交互式质询):使用 site key
3x00000000000000000000FF测试交互式质询流程。
有关完整测试密钥列表和预期行为,请参阅测试 Turnstile 实施。
以下示例创建一条速率限制规则:同一 IP 在一分钟内对登录路径发送超过五次 POST 请求后,发起托管质询 (Managed Challenge)。建议从托管质询而非阻止开始。托管质询允许触发限制的合法用户通过完成质询后继续访问,同时阻止无法完成质询的自动化流量。在监控安全事件确认规则不会产生误报后,再切换为阻止。请根据您的站点调整路径(/login)、阈值和周期。
-
在 Cloudflare 仪表板中,前往 Security rules(安全规则) 页面。
Go to Security rules ↗ -
选择 Create rule(创建规则),然后选择 Rate limiting rules(速率限制规则)。
输入规则名称(例如 "Rate limit login endpoint")。
在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:
将 `example.com` 替换为您的域名,将 `/login` 替换为您登录端点的路径。http.host eq "example.com" and http.request.uri.path eq "/login" and http.request.method eq "POST"-
在 With the same characteristics(具有相同特征) 下,确认已选择 IP。在 Free 计划中,此值预设为 IP。
在 When rate exceeds(当速率超过) 下,为 Requests(请求数) 输入 5,并为 Period(周期) 选择一个值。在 Free 计划中,选择 10 seconds。Pro 及以上计划提供更多周期选项。各计划可用值请参阅 Rate limiting parameters。
-
在 Then take action(则执行操作) 下,从 Choose action(选择操作) 下拉菜单中选择操作。在 Free 计划中,选择 Block。在 Pro 及以上计划中,建议使用 Managed Challenge,因为触发限制后,合法用户可通过完成质询通过。
-
在 For duration(持续时间) 下,选择操作的持续时间。在 Free 计划中,选择 10 seconds。Pro 及以上计划提供更长的持续时间。这是触发速率限制后操作生效的时长。
-
选择 Deploy(部署)。
对于经常遭受凭据填充攻击的网站,可考虑部署多条严重程度递增的速率限制规则。速率限制最佳实践页面描述了一种递增惩罚模式,使用三条规则:短窗口规则应对快速突发、中窗口规则应对较慢的分布式攻击,以及长窗口规则阻止持续攻击者访问整个域。计数表达式使用响应状态码,因此成功的登录不会计入限制。请参阅最佳实践页面了解推荐的阈值和表达式语法。
应用程序安全自定义规则和流量检测提供了除请求速率之外的额外信号,用于识别可疑登录流量并采取行动。检测功能会填充请求字段(例如泄露凭据状态和机器人分数),供自定义规则引用。
泄露凭据检测会扫描传入的登录请求,查找出现在已知数据泄露数据库中的用户名和密码。Cloudflare 在比较前会对凭据进行哈希处理,不会存储明文密码。找到匹配项后,检测会填充可在自定义规则和速率限制规则中使用的字段。
cf.waf.credential_check.password_leaked 字段在所有计划上均可用。
在 Free 计划中,leaked credentials detection 默认启用,无需操作。在付费计划中,可在 Cloudflare 仪表板、通过 API 或使用 Terraform 开启检测。
-
在 Cloudflare 仪表板中,前往 Security Settings(设置) 页面。
Go to Settings ↗ -
(可选)按 Detection tools 筛选。
-
开启 Leaked credential detection。
- 登录 Cloudflare 仪表板 ↗,并选择你的账户和域名。
- 前往 Security(安全性) > Settings(设置)。
- 在 Incoming traffic detections 下,开启 Leaked credentials。
使用类似以下的 POST 请求:
Required API token permissions
At least one of the following token permissions is required:Zone WAF WriteAccount WAF Write
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/leaked-credential-checks" \
--request POST \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--json '{
"enabled": true
}'使用 cloudflare_leaked_credential_check 资源来为区域启用泄露凭据检测。例如:
resource "cloudflare_leaked_credential_check" "zone_lcc_example" {
zone_id = var.cloudflare_zone_id
enabled = true
}启用检测后,您的源服务器可以通过 Exposed-Credential-Check 请求标头接收泄露凭据状态。要转发此标头,请启用 Add leaked credentials checks header(添加泄露凭据检查标头) 托管转换。然后,您的源站可以触发受影响用户的密码重置。
在部署质询或阻止登录流量的规则之前,请先创建 Skip 规则以豁免已知合法自动化流量。这可防止监控工具、健康检查和合作伙伴集成被后续规则阻止。
-
在 Cloudflare 仪表板中,转到 Security rules(安全规则) 页面。
Go to Security rules ↗ -
选择 Create rule(创建规则) 并选择 Custom rules(自定义规则)。
-
输入规则名称(例如 "Skip login rules for known clients")。
-
选择 Edit expression(编辑表达式) 并输入匹配合法自动化流量的表达式。例如,跳过已验证机器人和特定监控服务 IP:
(cf.client.bot) or (ip.src eq 198.51.100.1)将
198.51.100.1替换为您的监控服务 IP 地址。为其他已知客户端添加更多条件。 -
在 Then take action(然后采取行动) 下,选择 Skip(跳过)。在 WAF components to skip(要跳过的 WAF 组件) 下,选择适用于登录保护规则的组件(例如 All remaining custom rules(所有剩余自定义规则) 和 All rate limiting rules(所有速率限制规则))。
-
选择 Deploy(部署)。
-
在 Place at(放置于) 下,将此规则放在阻止和质询规则之上。自定义规则按顺序执行,因此 Skip 规则必须排在最前。
有关 Skip 操作和可用 Skip 选项的更多信息,请参阅 Skip 操作。
凭据填充工具通常会发送不带标准浏览器标头或带有已知不良 User-Agent 模式的请求。创建一条自定义规则,对登录路径上 User-Agent 为空的 POST 请求发起托管质询。这针对来自 curl、python-requests 或 undici 等未设置 User-Agent 标头的工具的直接 POST 请求。
-
在 Cloudflare 仪表板中,转到 Security rules(安全规则) 页面。
Go to Security rules ↗ -
选择 Create rule(创建规则) 并选择 Custom rules(自定义规则)。
-
输入规则名称(例如 "Challenge empty UA on login")。
-
选择 Edit expression(编辑表达式) 并输入:
(http.request.uri.path eq "/login" and http.request.method eq "POST" and len(http.user_agent) eq 0)将
/login替换为您的登录端点路径。 -
在 Then take action(然后采取行动) 下,选择 Managed Challenge(托管质询)。
-
选择 Deploy(部署)。
将速率限制与泄露凭据检测结合,以限制使用已知泄露密码的登录尝试。当同一 IP 在一分钟内发送超过三次带有泄露密码的请求时,此规则会发起托管质询。
-
在 Security rules(安全规则) 页面上,选择 Create rule(创建规则) 并选择 Rate limiting rules(速率限制规则)。
Go to Security rules ↗ -
输入规则名称(例如 "Rate limit leaked credentials")。
-
在 When incoming requests match(当传入请求匹配时) 下,输入以下表达式:
http.request.uri.path eq "/login" and http.request.method eq "POST" and cf.waf.credential_check.password_leaked将
/login替换为您的登录端点路径。 -
在 With the same characteristics(具有相同特征的内容) 下,确认已选择 IP。在 Free 计划上,此选项预设为 IP。
-
在 When rate exceeds(速率超过此数值时) 下,在 Requests(请求) 中输入 3,并为 Period(时段) 选择一个值。在 Free 计划上,选择 10 seconds(10 秒钟)。
-
在 Then take action(接着采取措施) 下,选择操作。在 Free 计划上,选择 Block(阻止)。在 Pro 及更高版本上,建议使用 Managed Challenge(托管质询)。
-
在 For duration(持续时间) 下,选择操作的持续时间。在 Free 计划上,选择 10 seconds(10 秒钟)。
-
选择 Deploy(部署)。
部署前面各节的规则和配置后,请监控登录端点以验证规则是否生效,并检测新的攻击模式。
安全事件显示 Cloudflare 安全产品已处理或标记的请求,包括阻止、质询和跳过。
-
在 Cloudflare 仪表板中,转到 Analytics(分析) 页面。
Go to Analytics ↗ -
选择 Events(事件) 选项卡。
查看 Sampled logs(采样的日志) 以检查单个请求。每条日志条目显示采取的操作、触发的规则、源 IP、User-Agent、URI 路径和国家/地区。使用 Add filter(添加过滤器) 按钮按操作、源 IP、ASN 或其他字段缩小结果范围。
注意误报——您的规则错误质询或阻止的合法流量。常见迹象包括:
- 来自已知监控服务或支付处理商的请求出现在被阻止事件中
- 来自您拥有真实用户所在国家/地区的大量被质询请求
- 速率限制规则在高峰流量期间触发合法用户
如果您看到合法用户受到影响,请调整速率限制阈值或为特定 IP 范围添加 Skip 规则。
设置 Security Events Alert(安全事件警报) 通知,以便在安全事件量激增时收到警报,从而及早发现新的攻击活动。此通知位于 Notifications(通知) 页面的 WAF 类别中。有关设置说明,请参阅创建通知。Enterprise 客户可以使用 Advanced Security Events Alert(高级安全事件警报) 进行更精细的筛选。
机器人流量分析显示登录端点随时间的机器人分数分布。登录路径上低分流量(分数 1-29)的突然激增是凭据填充活动的早期信号。
Cloudflare 根据机器人评分和验证状态将机器人流量分为以下类别:
- 已验证机器人(Verified bots):Cloudflare 已确认为合法的爬虫和服务,例如 Googlebot、Bingbot 和正常运行时间监控器。Cloudflare 维护一个已验证机器人列表,并设有严格要求。
- 自动化(Automated)(评分 1):Cloudflare 高度确定该请求为自动化请求。
- Likely automated(可能自动化)(评分 2-29):可能是机器人。此类别与"自动化"类别是安全规则的主要目标对象,包括抓取工具、凭据填充工具和垃圾信息提交者。
- 可能是真人(Likely human)(评分 30-99):这些请求似乎来自真实用户。请勿对此流量发起质询或进行封锁。
-
在 Cloudflare 仪表板中,转到 Security(安全性) > Analytics(分析) > Bot analysis(机器人分析)。
-
查看上述机器人分数分组之间的流量分布。
如果您发现尽管已部署本指南中的规则,仍有持续的自动化流量到达登录端点,请查看安全功能互操作性页面以验证规则是否按预期顺序执行,并考虑调整阈值。
应用程序安全
- 速率限制最佳实践 — 登录保护和凭据填充的推荐模式
- 自定义规则 — 使用包括机器人分数和泄露凭据在内的请求字段创建规则
- 泄露凭据检测 — 扫描传入请求中来自已知数据泄露的凭据
- 安全事件 — 查看安全产品已处理的请求
Cloudflare Bots
- Bot Fight Mode — 对已知机器人模式发起质询的免费机器人保护
- Super Bot Fight Mode — Pro 和 Business 机器人保护,可配置操作
- Bot Management — 具有 ML 驱动评分和自定义规则的 Enterprise 机器人保护
Turnstile
- Turnstile 入门 — 创建小组件并实现客户端和服务器端验证
- 服务器端验证 — 在服务器上验证 Turnstile 令牌
- Turnstile 预验证清关 — 为 SPA 和 AJAX 登录流程预清关访问者
SSL/TLS
- 始终使用 HTTPS — 将所有 HTTP 请求重定向到 HTTPS
- HTTP 严格传输安全 (HSTS) — 使用 HSTS 标头防止浏览器降级攻击