共享主机带搜索功能站点的自动化查询拦截方案咨询
结合你的场景(共享主机、SQL执行限制、已有CSRF防护),以下是几个对用户体验影响极小的方案:
会话/IP级频率限制
给每个用户会话(或IP)设置搜索次数阈值,比如1分钟内最多允许5次搜索请求。超过阈值时,暂时拒绝后续请求(可返回友好提示:“搜索过于频繁,请稍后再试”)。实现上可以用会话存储($_SESSION)记录时间戳和次数,或者用文件缓存(注意加锁避免并发问题)。对登录用户可适当放宽限制——机器人通常会短时间内发起大量请求,这个方案能有效拦截大部分批量查询。蜜罐字段拦截
在搜索表单中添加一个隐藏的输入字段(比如命名为_honeypot,用CSS设置display: none),真实用户看不到也不会填写,但自动化爬虫会默认填充所有字段。后端校验时,如果这个字段有值,直接丢弃请求,不执行SQL查询。这个方法完全不影响用户体验,能过滤绝大多数无差别爬虫。用户行为验证
通过前端JS记录用户的交互行为,比如页面停留时间、鼠标移动/滚动事件,将这些信息通过隐藏字段或会话传递给后端。比如要求用户在页面停留至少2秒才能提交搜索,或者检测到鼠标移动后才允许提交请求。机器人通常不会模拟这类真实用户的交互,能有效区分人机。高频搜索结果缓存
对热门搜索关键词的结果做缓存(比如用文件缓存或共享主机支持的轻量缓存工具),当用户搜索这些关键词时,直接返回缓存结果,无需执行SQL查询。这样即使机器人反复搜索热门词,也不会触发SQL执行限制,同时还能提升真实用户的搜索速度。改用POST请求
把当前的GET搜索改成POST提交,自动化爬虫更倾向于构造简单的GET请求,POST方式配合已有的CSRF防护,能增加机器人模拟的难度。同时POST请求的参数不会暴露在URL中,也能减少被爬虫抓取关键词的概率。一次性动态Token
在搜索页面加载时,生成一个唯一的一次性Token并存入会话,表单提交时携带这个Token,后端校验Token有效性后才执行查询。Token使用后立即失效,或者设置短有效期(比如30秒),这样机器人难以重复利用同一个Token发起批量请求。
内容的提问来源于stack exchange,提问作者www.friend0.in

