2009-06-27

博客防垃圾评论探讨

Views: 20040 | 3 Comments

由于 Web/HTTP 的流行(Web 基于 HTTP, 超文本传输协议), 人们开发了大量的 Web 开发库, 这使得, 提交一个表单发表评论是一件非常简单的事. 如果使用脚本语言, 甚至能仅用 3, 5 行代码便能解决.

博客防垃圾评论, 是每一个博主十分关心了头疼的问题, 特别是使用了 WordPress 这类十分流行的开源博客软件, 那么被垃圾评论盯上的机率就更甚了. 同时, 这些软件也提供了防垃圾评论(anti-spam)插件, 用于解决这个问题.

1. 垃圾评论的分类

垃圾评论根据产生方式在可以分为两大类: 人工垃圾评论, 机器人垃圾评论.

1.1. 人工垃圾评论

人工垃圾评论是指, 某一个人类用户(人工垃圾评论制造者), 在网站上的所有的操作都和正常用户一样, 除了其提交的评论内容. 人工垃圾评论制造者使用常用的 Firefox/IE/Chrome 等浏览器, 输入页面链接, 然后复制粘贴评论内容到页面表单中, 再点击"提交"按钮. 为了提高垃圾评论提交的速度, 人工垃圾评论制造者可能会使用某些浏览器插件(如 Firefox 的操作, IE 的 ActiveX 控件), 模拟人类用户在浏览器中的浏览, 输入和点击. 这样, 人工垃圾评论制造者的工作量可以大大减轻.

1.2. 机器人垃圾评论

机器人垃圾评论一般完全独立于正常浏览器之外, 使用 HTTP 客户端库, 如 C 语言的 libcurl, Python 的 urllib2, C# 的 WebClient 等等. 使用这些开发库提交的数据, 在 Web 服务器看来, 和用户在浏览器中提交是没有区别的. 事实上, 浏览器也会使用一个类似的 HTTP 客户端库和服务器交互. 这样, 提交垃圾评论的整个过程, 可以完全由软件(这类软件称为"垃圾评论机器人")控制, 不需要人的参与.

2. 防垃圾评论的方法

2.1. 登录用户限制

这种方法限制, 必须是登录用户才可以提交评论. 这种方法简单, 因为几乎所有的博客程序都提供了这项功能. 该方法据使用效果来看, 有时候也十分有效的.

这种方法的缺点也很明显, 首先它限制了正常用户的评论热情, 使评论无法广泛得到参与. 其次, 用户的注册也会成为一个产生垃圾数据的地方, 而且, 有些博客系统因为赋予登录用户太多的权限, 不良企图者只需要一次人工注册, 之后便可以肆无忌惮地使用机器人进行评论, 危害非常大.

2.2. 评论提交频率限制

这种方法初看有效, 但其实没有多大用处, 因为正常用户的再次提交的间隔可能时间极短到不足一分钟, 也可能长到几天甚至几个月. 假设把时间间隔设置为 5 分钟, 一天也能被提交 60/5 * 24 = 288 条评论. 重要的问题是, 本方法必须依赖准确的用户身份识别. 使用 Session 或者 Cookie 都不行, 常用的方法是使用 IP, 但因为 NAT(如常用的多台电脑同时上网的无线路由器), 多个用户的标识是相同的.

2.3. 增加用户参与难度

这种方法十分愚蠢, 但也能见到不少人在使用. 这种方法基于两个假设: 垃圾评论机器人的智能足够低, 垃圾评论制造者的智力和时间有限. 这两个假设都可能很大程度上正确, 但降低了正常用户的用户体验, 阻挡了正常用户.

下表列出了常用的方法和它们各自的影响, 人类用户包括正常用户和垃圾评论制造者:

方法 人类用户难度 机器人难度
简单数字验证码
复杂数字验证码 较难
简单数学运算表达式求值

注: 难度词"难/易"前加上副词"极", 表示程序加甚. 如"较难"比"难"更复杂, 难度更大.

2.4. 链接数量限制

这种方法的一般原理, 当评论中出现超过一定数量的链接时, 将评论视为可能的垃圾评论, 所以加入待审核队列. 这种方法十分低效, 因为不良企图者可以通过评论的数量来增加链接的数量, 而不是在单个评论中使用大量链接.

2.5. 更高智能的语义识别

这种方式, 极大地增加博客程序的开发者开发难度和工作量. 语义识别是一个极具挑战性的领域. 幸运的是, 有一些现成的系统可以使用, 如 Akismet, 可以被 WordPress 等博客程序使用. 此类系统提交一个中央评论识别系统, 其客户端将评论内容提交给它, 然后它再返回评论的分类(比如是否垃圾评论).

3. 关于防止机器人垃圾评论的一种方法

目前, 垃圾评论主要是由机器人来提交的. 机器人几乎都有一个特性, 可以区别于人类用户. 那就是, 机器人不执行网页中的 JavaScript 代码. 如果在评论表单中加入一个隐藏域, 该域的值通过 JavaScript 来设置. 服务器在接收到提交的评论时验证一下, 就能识别出机器人. 这种方法对付机器人十分有效, 但对人工垃圾评论不起作用.

Related posts:

  1. 同时运行多个版本的Firefox
  2. JavaScript 多线程
  3. 非常抱歉, 博客前几天中了木马
  4. WordPress category widget using new 2.8 API
  5. 炮轰Firefox 3
Posted by ideawu at 2009-06-27 09:33:30 Tags:

3 Responses to "博客防垃圾评论探讨"

  • 3. 关于防止机器人垃圾评论的一种方法

    目前, 垃圾评论主要是由机器人来提交的. 机器人几乎都有一个特性, 可以区别于人类用户. 那就是, 机器人不执行网页中的 JavaScript 代码. 如果在评论表单中加入一个隐藏域, 该域的值通过 JavaScript 来设置. 服务器在接收到提交的评论时验证一下, 就能识别出机器人. 这种方法对付机器人十分有效, 但对人工垃圾评论不起作用.

    如果这个隐藏域的值是不变的,这样做还是防范不了,机器人可以增加POST这个隐藏域名的值就可以了,这个隐藏域的值最好是一个动态变化不容易获取的值,这样就能更安全 Reply
  • 回复blankyao:
    其实就是验证用户提交的隐藏域的值是否是服务器端设置的值. 这个值可以是把文章编号加一个私有字符串做MD5. Reply
  • “如果在评论表单中加入一个隐藏域, 该域的值通过 JavaScript 来设置. 服务器在接收到提交的评论时验证一下, 就能识别出机器人”,服务器在接收的时候要怎样来做验证才比较安全有效呢? Reply

Leave a Comment