网站如果禁止非浏览器访问, 一般主要还是防止自动 Spam, 主要是:
- 防止网站被机器人恶意抓取
- 防止网站被机器人恶意提交
判断恶意请求(程序和软件直接发送 HTTP 请求)的方法有很多, 比如同 IP 请求频率是. 但一旦判定某个请求为异常行为之后, 并不适合直接关闭该连接, 或者返回出错页. 因为绝大多数的判定方法都无法做到很高的正确率, 其主要原来就是缺少"交互性". "交互性"是判断人和机器的主要因素.
这里判断一种利用交互性来判别是否浏览器正常访问的方法:
- 当初步判定请求为异常时, 给该请求返回一个动态令牌, 要求对方在下次重新带着该令牌来访问原先请求的资源;
-
如何告知用户进行这个行为, 根据交互性的强弱依次为:
- 设置 Cookie
- 通过 JavaScript 脚本的执行(设置 Cookie, 生成带令牌的链接并访问)
- 显示网页表单, 要求用户进行点击和输入等操作(单纯的无输入表单, 图片验证码, 声音验证码)
- 第一种设置 Cookie 太过于简单, 因为一般的机器人都能执行该行为. 第二种 JavaScript 脚本的方式, 其实已经能阻挡大部分机器人. 第三种是非常好的识别那漏掉的一小撮高级机器人, 但同时也可能影响正常用户体验.