联系表单、注册表单和结账表单是自动滥用的常见目标。本指南涵盖了表单保护:验证访问者是否为人类、限制重复提交以及拦截已知的攻击模式。核心工作流程使用所有计划中可用的功能。Pro 和 Business 计划的功能以提示框的形式包含在内。
Turnstile 在没有可见质询的情况下验证访问者是否为人类。本指南使用 Managed 模式,该模式根据访问者的风险级别自动在非交互式或复选框质询之间进行选择。有关其他小组件模式,请参阅 小组件类型。
添加 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 脚本和小组件 div 元素添加到您要保护的每个表单中。将 <YOUR-SITE-KEY> 替换为上一步中的站点密钥。
<form id="contact-form" action="/submit" method="POST">
<input type="text" name="name" placeholder="Name" required />
<input type="email" name="email" placeholder="Email" required />
<textarea name="message" placeholder="Message" required></textarea>
<div class="cf-turnstile" data-sitekey="<YOUR-SITE-KEY>"></div>
<button type="submit">Submit</button>
</form>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>该小组件在表单中渲染,并在访问者通过验证时生成一个令牌。该令牌作为 cf-turnstile-response 字段包含在表单提交中。
服务器端验证是必需的。仅靠客户端小组件无法保护您的表单,因为攻击者可以直接向您的表单端点提交内容。令牌只能验证一次。
在处理任何表单提交之前调用 Siteverify API:
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 私钥。端点返回一个带有 success 字段的 JSON 对象。仅当 success 为 true 时,才处理表单提交。
有关 PHP、Python、Java 和 C# 中的验证示例,请参阅 验证令牌。
一些滥用脚本完全跳过浏览器并直接对您的表单端点发出 POST 请求。应用程序安全速率限制规则会捕获这些请求,因为客户端验证仅在浏览器中运行。
在创建速率限制规则之前,检查表单端点的正常提交速率。您的速率限制阈值应高于此基线,以避免屏蔽合法的流量。
-
在 Cloudflare 仪表板中,转到 Analytics(分析) 页面。
Go to Analytics ↗ -
在 流量 选项卡中,选择一个非高峰流量或访问者活动最低的时间段。
-
使用 Add filter(添加过滤器) 按钮将结果缩小到您的表单端点流量。
-
记录每个 IP 地址的典型请求速率。您的速率限制应高于此基准。
如果您没有足够的流量数据来建立基线,请从保守的阈值开始,并在部署后根据安全事件进行调整。
创建一条规则,限制单个 IP 地址在给定时间内向表单端点提交的次数。根据您的网站调整路径、阈值和时段。
-
在 Cloudflare 仪表板中,前往 Security rules(安全规则) 页面。
Go to Security rules ↗ -
选择 Create rule(创建规则),然后选择 Rate limiting rules(速率限制规则)。
输入规则名称(例如 "Rate limit contact form submissions")。
在 When incoming requests match(当传入请求匹配时) 下,选择 Edit expression(编辑表达式) 并输入:
将 "/contact" 替换为您的表单端点路径。(http.request.uri.path eq "/contact" 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 错误页面。有关详情,请参考 在仪表板中创建速率限制规则。
仅靠速率限制无法捕捉到表单字段中的特定目标攻击模式,例如 SQL 注入或跨站脚本 (XSS)。应用程序安全自定义规则和托管规则集允许您拦截针对表单端点的特定模式。在执行顺序中,自定义规则在速率限制规则和托管规则集之前运行。
创建一个自定义规则,向并非来自已验证机器人的表单端点 POST 请求发起质询。
-
在 Cloudflare 仪表板中,转到 Security rules(安全规则) 页面。
Go to Security rules ↗ -
选择 Create rule(创建规则) > Custom rules(自定义规则)。
-
输入规则的名称(例如,“Challenge spam form submissions”)。
-
在 When incoming requests match(当传入请求匹配时) 之下,选择 Edit expression(编辑表达式) 并输入:
(http.request.uri.path eq "/contact" and http.request.method eq "POST" and not cf.client.bot)将
/contact替换为您的表单端点路径。not cf.client.bot子句可豁免已验证的机器人(如搜索引擎爬虫)受该规则影响。 -
在 Then take action(接着采取措施) 下,选择 Managed Challenge(托管质询)。
先从托管质询开始,以观察哪些请求会被标记,然后再切换为阻止。
-
选择 Deploy(部署)。
部署后,查看安全事件以检查该规则是否匹配到了合法流量。如果合法用户受到质询,请缩小表达式范围或改用较温和的操作。
Bot Fight Mode 对与已知机器人模式匹配的整个域的请求发起质询。它在所有计划中均可用,并且除了开启它之外无需任何配置。
-
在 Cloudflare 仪表板中,转到 Security settings(安全设置) 页面。
Go to Settings ↗ -
按 Bot traffic(机器人流量) 筛选。
-
转到 Bot fight mode。
-
开启 Bot fight mode。
- 登录 Cloudflare 仪表板 ↗,选择您的账户和域名。
- 转到 Security(安全性) > Bots(机器人)。
- 对于 Bot Fight Mode,选择 On(开启)。
Bot Fight Mode 保护您的整个域而没有端点限制。您无法使用自定义规则创建例外来绕过 Bot Fight Mode。
部署 Turnstile、速率限制规则和应用程序安全规则后,监控您的表单端点以验证您的规则是否有效并检测新的攻击模式。
安全事件 显示 Cloudflare 安全产品已处理或标记的请求,包括阻止、质询和跳过。通过表单端点路径过滤以查看阻止的内容和通过的内容。向表单路径发出大量阻止或质询请求表明规则已处于活动状态。
-
在 Cloudflare 仪表板中,转到 Analytics(分析) 页面。
Go to Analytics ↗ -
选择 Events(事件) 选项卡。
-
使用 Add filter(添加过滤器) 按钮将结果缩小到您的表单端点流量。
-
审查采样的日志。对于每个事件,检查:
- 采取的操作:请求是被阻止、质询还是允许
- 来源:触发操作的规则或功能
- IP 地址:单个 IP 是否生成大量事件
- URI Path(URI 路径):请求是否专门针对表单端点
如果合法用户受到质询,请缩小规则表达式或改用较温和的操作。
配置一条通知,当域中的安全事件出现异常峰值时便发出警报。
有关警报类型、触发阈值和设置说明,请参考安全事件警报。
如果有第三方脚本被注入到您的表单页面中,它就能窃取已提交的数据,包含付款信息等。客户端安全性会监控页面上的第三方脚本,查看是否发生更改或存在潜在的供应链攻击。
若要启用监控:
-
在 Cloudflare 仪表板中,转到 Security Settings(安全设置) 页面。
Go to Settings ↗ -
(可选)筛选出 Client-side abuse(客户端滥用)。
-
开启 Continuous script monitoring(持续脚本监控)。
启用后,可在 Web assets(Web 资产) 页面的 Client-side resources(客户端资源) 选项卡中查看检测到的脚本,找出表单页面上的意外脚本。完整设置流程请参阅客户端安全性入门。
Turnstile
- Turnstile 入门 — 创建小组件、添加客户端代码片段并验证令牌
- 验证令牌 — 多种语言的服务器端验证示例
- 集成 Turnstile、WAF 及 Bot Management — 将这三项产品结合用于登录保护的教程
应用程序安全
Bots(机器人)
- Bot Fight Mode — 在 Free 计划上质询匹配机器人模式的请求
- Super Bot Fight Mode — 为 Pro 及以上计划提供更精细的机器人控制
客户端安全
- 客户端安全性入门 — 启用监控并查看检测到的脚本