功能预览
人机验证从点选图片转向按风险放行,Cloudflare Turnstile 提供托管、非交互与不可见三种形态,勾选框只在风险偏高时才出现。令牌交到后端不等于安全,服务端仍要校验来源、按表单场景分级放行,并对验证失败给出可处理的返回。
给网站表单加人机验证,很多人还停留在弹图片、挑红绿灯的印象里。现在更常见的做法是按风险放行:正常访客一路通过,风险偏高的请求才会看到勾选框。于是问题分成两半,前端怎么少打扰人,以及验证通过之后,后端还要验什么。下面从判定方式、形态选择、服务端校验和失败返回四步展开,最后附几则常见问题。
以 Cloudflare Turnstile 的公开说明为例,它把自己描述为免 CAPTCHA、隐私取向的机器人防护替代方案,判定依靠浏览器里运行的客户端安全挑战,观察环境特征与行为信号,而不是靠一道肉眼题目去考人。它的 Managed 形态会按访客风险水平自动决定是否需要显示勾选框:多数低风险访客完全无感,风险偏高时才出现一个复选框点一下。
这也解释了为什么页面看起来什么都没做就通过了。对表单来说,前端拿到的是风险判定结果,后端的职责并没有减少,只是换了校验对象。
差别在于访客被要求的程度。托管形态由平台自行决定要不要出交互;非交互形态默认无感,只在风险升高时给出一次挑战;不可见形态全程不出现控件,判定完全在后台完成,因此对失败处理的要求更高。
| 形态 | 访客感知 | 典型表单 | 落点 |
|---|---|---|---|
| 托管 Managed | 多为无感,风险高时出现勾选框 | 注册、找回密码 | 平衡打扰与拦截 |
| 非交互 Non-interactive | 默认无感,必要时一次挑战 | 留言、订阅 | 中等风险场景 |
| 不可见 Invisible | 完全无控件 | 登录、下单前风控 | 需配合限流与设备特征 |
选择时可以先看表单被批量提交的历史,以及业务能接受的打扰程度。登录页更在意流畅,不可见更合适;注册页一旦被脚本刷,后果比较重,托管形态的弹性更好用。
前端拿到的往往是一枚短时令牌,它只证明浏览器侧做过挑战,不证明提交这条数据的确实是浏览器。省掉服务器端的校验,等于门槛只装在门上,脚本仍可绕过页面直接调接口。
服务端这一步至少核对三项内容:令牌是否有效且没有被重复使用,令牌绑定的站点密钥与业务场景是否互相对应,来源域名与时间窗是否落在允许范围内。AnQiCMS 的表单可以接入 reCAPTCHA 一类的验证码,走的同样是前端取令牌、服务端再校验一遍、失败时给出返回的链路。把这条判定留在服务端,前端样式怎么改都不会直接影响防护强度。
失败返回要能被供应商处理,而不是笼统一句提交失败。常见做法是把情形分开:令牌无效、令牌过期、同一令牌重复提交、风险评分不足。返回里带上可识别的编码与简短说明,前端才好决定是重新触发挑战、提示稍后再试,还是直接拒绝。
同时按表单维度记录失败率与重复提交次数。失败率突然抬高,多半出在前端取令牌的环节;同一来源的重复提交集中,则更接近脚本行为,可以在接口层追加节流。
问:勾选框一次都没出现,是不是验证没生效? 答:未必。按风险放行的形态在低异常时段本来就可能全程无感。可以用明显的自动化请求自测一次,看是否被要求做挑战。
问:前端已经拦住了,后端还要再验一遍吗? 答:要。前端拦截只覆盖真实浏览器那条路径,接口依然可能被直接调用,服务器端的令牌校验才是防线真正落地的位置。
问:不可见形态会不会让误拦更难处理? 答:因为看不到控件,用户缺少重试入口,所以要把失败返回和人工申诉路径设计完整,再结合日志观察趋势。
预览
附件下载时中文文件名乱码,多半是响应头里只写了 filename 或只写了 filename*。规范文档给出的做法是两个一起写:带星号的参数按 UTF-8 百分号编码且优先级更高,不带星号的保留 ASCII 形式兼容旧客户端。本文同时说明目录分隔符为什么要替换。
预览
接口文档面向调用方,说明怎么请求、有哪些公开能力;站点说明文件面向大语言模型,帮助模型理解和索引网站内容。两者读者不同、作用不同,一个管调用一个管理解,且都要能被抓取。站点说明文件由系统自动生成,配合站点地图分工:站点地图管发现,说明文件管理解。
预览
用一套系统管理多品牌、多主题网站时,站点边界决定域名与后台入口,语言层级决定翻译范围,内容模型决定字段是否共用。域名与主站语言按站点独立,模板与内容模型可在共享与独立之间取舍,导航与单页面按站点各自维护。