前几天研究 Turnstile 的时候翻到一篇文章。文章内介绍了 Turnstile 的 Pre-Clearance
功能,我觉得很有趣:
我们都知道 Cloudflare 的5秒盾被解决之后,会生成一个 cf_clearance
的cookie表示你已清关,后续请求会带上这个cookie畅通的无阻。这个cookie的表面有效期是 1年
,实际上根据设置来定:
打开5秒盾意味着要有一个页面去过盾,不是很优雅。如果我们只想对一些关键接口(比如写接口)做保护,一般我们会接入 Turnstile 此类的验证码系统。我们在接入 Turnstile 的时候通常需要在服务端去 Cloudflare 验证提交过来的令牌是否有效,效率不高。
但现在借助 Pre-Clearance
生成的 cf_clearance
我们可以服务端免验证,非常灵活地保护这些关键接口,还不用打开页面的5秒盾,几乎无感知。
我们去 Turnstile 生成设置一个站点:
交互模式自己选。主要是要设置下方的预先许可。预先许可允许级别让你决定 Turnstile 解决之后生成的 cf_clearance
可以解决什么级别的waf拦截。
设置好之后拿到 站点密钥
在页面header中埋入js:
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
在页面合适位置放上标签:
<div class="cf-turnstile" data-sitekey="站点密钥"></div>
就完成了。这个页面被打开后解决了(选不可见
小组见模式自动解决) Turnstile 即可种下 cf_clearance
cookie。
之后我们只需要去 waf 规则里设置对你网站的哪些 API 接口进行质询即可,服务端不需要做任何代码开发。Turnstile 自动管理 cf_clearance
,过期会自动触发解决来刷新。想用验证码保护什么接口只需要cf设置,脏活累活交给大善人。
更多高级玩法可以看本文开头的文章。
最后,你能感受到L站的验证码吗?