HTML表单honeypot隐藏checkbox提交后POST值始终返回'on'问题求助
问题原因分析
这个问题的核心本质是正常未勾选的checkbox本就不会被浏览器纳入表单提交数据,你遇到的$_POST['validate_box']始终存在的情况,通常是以下几种原因导致的:
- 爬虫/自动提交脚本的主动填充
大部分恶意爬虫提交表单时,会主动给所有识别到的表单字段赋值,对于checkbox类型会默认设为勾选状态,不管是否可见。这本来就是蜜罐要识别的特征:正常用户看不到这个checkbox,不可能勾选,只要提交的请求里存在validate_box字段,就可以直接判定为恶意请求拦截。 - 服务端代码的提前赋值
检查你的PHP代码(包括引用的框架底层、公共前置文件)是否存在对$_POST数组的全局处理逻辑,比如自动补全缺失字段、过滤逻辑中误给不存在的键赋值的情况,会导致不管前端是否提交,你读取时该字段都存在。 - 前端冗余逻辑或同名字段
检查你的表单内是否存在其他name="validate_box"的隐藏输入字段,比如<input type="hidden" name="validate_box" value="on">这类代码;同时排查是否有全局JS逻辑自动将所有隐藏的checkbox设为勾选状态,两种情况都会导致服务端始终能拿到该参数。 - 浏览器扩展的异常行为
部分密码管理、表单自动填充类的浏览器扩展,会强制给所有表单字段填充默认值,哪怕是隐藏的checkbox,你可以用浏览器隐私模式禁用所有扩展后重新测试,确认是否是扩展导致的问题。
补充说明:你原本的蜜罐逻辑其实是反过来的:正常用户提交的请求里,不应该存在
$_POST['validate_box']这个字段,只要出现该字段就说明是恶意请求,直接拦截即可,不需要判断它的值是on还是自定义内容。
内容的提问来源于stack exchange,提问作者Kristián Filo
相关产品推荐
相关产品推荐

