JS 挑战(工作量证明)¶
Website Defender 可以向访问者提供基于 JavaScript 的工作量证明(Proof-of-Work)挑战,有效过滤无法执行 JavaScript 的自动化机器人和简单脚本。
工作原理¶
- 访问者的浏览器接收到一个包含 JavaScript 挑战的 HTML 页面
- 浏览器计算 SHA256 工作量证明(找到一个使哈希值具有指定数量前导零的随机数)
- 计算成功后,设置一个签名 Cookie(
_defender_pow) - Cookie 有效期为 24 小时(可配置),并绑定到访问者的 IP
- 后续携带有效 Cookie 的请求将跳过挑战
挑战模式¶
| 模式 | 行为 |
|---|---|
off |
禁用 JS 挑战 |
suspicious |
仅对威胁评分 >= 10 的 IP 发起挑战 |
all |
对所有没有有效通行 Cookie 的新访问者发起挑战 |
推荐模式
大多数部署场景推荐使用 suspicious 模式。它仅对已经表现出可疑行为的访问者发起挑战,最大限度减少对正常用户的影响。
跳过挑战的情况¶
以下请求会自动跳过 JS 挑战:
- 白名单 IP -- 白名单中的 IP 始终免于挑战
- 已认证请求 -- 携带有效
Defender-Authorization请求头的请求 - Git/许可证令牌 -- 携带配置的 Git 或许可证令牌请求头的请求
- 非浏览器客户端 -- 被识别为
git、curl、wget等的客户端 - Auth 子请求 -- Nginx
auth_request使用的/auth端点
难度设置¶
难度设置控制解决挑战所需的计算量:
| 难度 | 前导零数 | 大约迭代次数 |
|---|---|---|
| 1 | 1 | ~16 |
| 2 | 2 | ~256 |
| 3 | 3 | ~4,096 |
| 4(默认) | 4 | ~65,536 |
| 5 | 5 | ~1,048,576 |
| 6 | 6 | ~16,777,216 |
难度越高,客户端需要的计算时间越长。默认值 4 在机器人防护和用户体验之间取得了良好平衡(在现代设备上通常不到 2 秒即可完成)。
配置¶
js-challenge:
enabled: false
# 模式:off | suspicious | all
mode: "suspicious"
# 难度:SHA256 哈希前导零数量(1-6)
difficulty: 4
# 通行 Cookie 有效期(秒),默认 24 小时
cookie-ttl: 86400
# Cookie 签名密钥(留空则自动生成)
cookie-secret: ""
JS 挑战设置也可以通过管理后台的系统设置页面进行配置。
生产环境 Cookie 密钥
如果 cookie-secret 留空,每次重启时会生成随机密钥,导致所有已有的通行 Cookie 失效。请在生产环境中设置固定密钥。