JavaScript 检测(JavaScript Detections)是一种独立于 Cloudflare 质询页面(Challenge Pages)或 Turnstile 的质询类型。JavaScript 检测帮助 Cloudflare 的机器人解决方案识别自动请求。
质询页面和 Turnstile 依赖客户端信号来确定请求的真实性,而机器人管理(Bot Management)的 JavaScript 检测既依赖客户端信号,又会在对您的网站发出的每个请求上运行。
JavaScript 检测通过遵循 Cloudflare 隐私标准 ↗的轻量级、不可见的 JavaScript 代码片段在您的网站上实施。
仅响应对 HTML 页面或页面浏览的请求时才会注入 JavaScript,不包括 AJAX 调用。API 和移动应用程序流量不受影响。
JavaScript 检测的生命周期为 15 分钟。但是,在会话到期之前,代码会再次注入。页面加载后,脚本被延迟,并利用单独的线程(在可用的情况下)以确保将性能影响降至最低。JavaScript 代码片段将包含一个指向 Challenge Platform 的源,路径以 /cdn-cgi/challenge-platform/… 开头。
将 JavaScript 检测注入 HTML 页面后,访问者的浏览器将运行 JavaScript 代码片段,并向访问者发出 cf_clearance cookie。JavaScript 检测中的信息存储在 cf_clearance cookie 中,用于填充 js_detection.passed。
- 如果访问者已通过验证并发出
cf_clearancecookie,它将包含结果:cf.bot_management.js_detection.passed=true - 如果验证失败,cookie 将包含结果:
cf.bot_management.js_detection.passed=false
当访问者在您的网站上遇到 WAF 自定义规则时,该规则将检查 cf_clearance cookie 的结果。cf_clearance cookie 的结果决定请求是否通过,或者被阻止或质询。
请参阅以下步骤以启用和强制执行 JavaScript 检测。
对于 Bot Fight Mode 客户,JavaScript Detections 是 automatically enabled and cannot be disabled。
对于 Super Bot Fight Mode and Bot Management for Enterprise 客户,JavaScript Detections 是 optional。
-
在 Cloudflare 仪表板中,转到 Security Settings(安全设置) 页面。
Go to Settings ↗ -
在您的 Bot 流量计划配置下,选择 JS detections(JS 检测) 的编辑图标并开启 JavaScript Detections(JavaScript 检测)。
- 登录 Cloudflare 仪表板 ↗,然后选择您的账户和域。
- 转到 Security(安全) > Bots。
- 选择 Configure Bot Management(配置 Bot Management)。
- 对于 JavaScript Detections(JavaScript 检测),将开关切换为 On(开启)。
有关如何设置机器人保护的更多详细信息,请参考 Bots 文档。
启用 JavaScript 检测后,您必须使用 cf.bot_management.js_detection.passed 字段来创建 WAF 自定义规则(或在 Workers 中使用 request.cf.botManagement.jsDetection.passed 变量)。
将此字段添加到 WAF 自定义规则时,它用于预期浏览器流量的端点(避免原生移动应用程序或 websocket 端点),在用户对您的应用程序发出首次请求之后(Cloudflare 至少需要一个 HTML 请求才能注入 JavaScript 检测),并配合 Managed Challenge(托管质询)操作,因为用户可能因为正当理由未通过 JavaScript 检测质询(网络问题、广告拦截器、浏览器中禁用 JavaScript、原生移动应用程序)。
- 您必须拥有 Enterprise Bot Management 订阅。
- 您必须在您的区域启用 JavaScript 检测。
- 您必须为 JavaScript 检测更新您的内容安全策略(CSP)标头。
- 您不得在 websocket 端点上运行此字段。
- 您必须在仅预期浏览器流量的自定义规则表达式中使用该字段。
- 为了防止合法用户由于网络或浏览器原因未收到质询,该操作应始终为 Managed Challenge(托管质询)。
- 在规则构建器中指定的路径绝不能是用户浏览您的网站时访问的首个 HTML 页面。
绝不应该在匹配访问者对站点首次请求的 WAF 自定义规则中使用 cf.bot_management.js_detection.passed 字段。在 Cloudflare 能够注入 JavaScript 检测之前,至少需要有一个 HTML 请求。
(http.request.uri.path eq "/api/v4/user/create" and http.request.method eq "POST" and not cf.bot_management.verified_bot)
and (cf.bot_management.score lt 30 or !cf.bot_management.js_detection.passed)"botManagement": {
"jsDetection": {
"passed": false
}
}有关创建自定义规则的更多信息,请参考 WAF 文档。
如果您通过仪表板启用 JavaScript 检测,Cloudflare 将在您的网站上提供的所有 HTML 页面中插入脚本标签。如果您希望限制提供 JavaScript 检测的位置,可以通过 JavaScript 检测 API 脚本来执行。
JavaScript 检测 API 允许您对网站上何时何地注入 JavaScript 检测进行更细粒度的控制,并提供了回调处理选项(用于日志记录或其他额外操作)。
您可以明确添加对 /cdn-cgi/challenge-platform/scripts/jsd/api.js 的脚本引用,并在网站的特定 HTML 页面上调用您自己的调用 window.cloudflare.jsd.executeOnce 的代码。
必须将以下脚本添加到希望启用 JavaScript 检测的每个页面:
<script>
function jsdOnload(){
window.cloudflare.jsd.executeOnce(
{
callback: function(result){
console.log('jsd outcome', result);
}
}
);
}
</script>
<script src="/cdn-cgi/challenge-platform/scripts/jsd/api.js?onload=jsdOnload" async>JavaScript 检测不保证特定的机器人分数。
- 如果 JavaScript 检测注入或执行失败且
cf.bot_management.js_detection.passed=false,则独立的机器人管理启发式算法仍可产生1或更高的机器人分数,这与 JavaScript 检测无关。 - 如果 JavaScript 检测通过,则由于其他检测启发式算法(例如,已知的恶意 IP、签名检测等),最终机器人分数仍可能为
1,从而导致js_detection.passed=true,但score=1。
在 2020 年 6 月之前启用 Enterprise Bot Management 的客户默认不会启用 JavaScript 检测(除非特别要求)。这些客户仍然可以在 Cloudflare 仪表板中启用该功能。
新客户端对您的网站或应用程序发出的首个请求通常不会有 JavaScript 检测数据(cf.bot_management.js_detection.passed = false)。这是因为在注入 JavaScript 检测并发出 cf_clearance cookie 之前,Cloudflare 至少需要一个 HTML 请求。
如果 JavaScript 成功运行,随后的请求可以包含 cf_clearance cookie。
如果您设置了内容安全策略(CSP),则需要执行额外步骤来实现 JavaScript 检测:
- 确保允许
/cdn-cgi/challenge-platform/下的所有内容。您的 CSP 应允许来自您源域名的脚本(script-src self)。 - 对于
nonce脚本标签:-
如果您的 CSP 对脚本标签使用
nonce,Cloudflare 将通过解析您的 CSP 响应标头,将这些 nonce 添加到其注入的脚本中。 -
如果您的 CSP 对脚本标签未使用
nonce且已启用 JavaScript 检测,您可能会看到如下控制台错误:Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-b123b8a70+4jEj+d6gWI9U6IilUJIrlnRJbRR/uQl2Jc='), or a nonce ('nonce-...') is required to enable inline execution.我们强烈不建议使用unsafe-inline,而是推荐在脚本标签中使用 CSPnonce,我们会解析并在我们的 CDN 中支持该方式。
-
启用 JavaScript 检测(JSD)将会从注入 JSD 的 HTML 响应中剥离 ETag。
如果源站响应包含 Cache-Control: no-transform 指令,Cloudflare 就不会注入 JavaScript 检测脚本。对于这些请求,cf.bot_management.js_detection.passed 字段将显示为 missing。
要使用 JavaScript 检测,请从您希望运行 JavaScript 检测的页面上的 Cache-Control 响应标头中删除 no-transform 指令。有关更多信息,请参考 Cache-Control 指令。