继续上文说到的Discuz如何才能有效过滤垃圾邮件,先对上文做一个小小的总结:
尽量不要通过增加验证行为对用户进行辨别,过度的验证行为会严重降低用户体验、最终导致用户因烦不胜烦而离开你的论坛。也不要对文章内容限定的过于苛刻,过多的限制、审核条件,不仅会加重服务器的负担,还会让用户感到没有言论自由,并无法从根本上杜绝垃圾信息的产生。
那么根据以上的不可行、总结,做为指导原则,我对论坛建立了一些简单的机制,经过实践发现是可以基本杜绝垃圾信息产生的:
一、根据注册行为判定注册者是否为真实的用户:
根据对论坛日志的分析发现,发布垃圾的机器人无论是注册还是发帖过程中,都是先构造POST数据包、然后发送到服务器的接收程序上。这些机器人虽然模拟了浏览器类型、系统类型、甚至模拟了来路信息,但均是针对与form注册过程来进行的。
这样就可以在处理提交的程序中加入对提交界面的验证来判断是否为机器人。具体做法是:在提交页面中用js或Iframe调用另一个程序,程序中产生一个随机验证码,之后再在注册过程中判断随机验证码是否存在即可。
因为机器人在模拟post提交过程中,并未对原始的提交表单页面进行全部处理,它只是简单的分析出表单内容,而没有对整个页面中的js、iframe等进行处理,因而被iframe调用到的页面显然不会被机器人爬虫抓取到,进而在处理注册过程的时候,就可以有效的区别注册者是否是常规途径提交的表单了。
二、内容的第三方审核与过滤:
这个方法实际上并不是很好,但是很有效,毕竟第三方的审核无论从准确性还是性能上,都要比自己的服务器强大。在博客系统中,最长被用到的是anti-spam等第三方插件,其实它们也提供针对论坛的插件和API,只要将用户发布的信息先送入审核接口,根据返回值即可判断内容是否为垃圾邮件。
第三方的审核参数主要有四项:用户IP、用户名、Email地址、正文内容,由这些参数综合判定给出的结论是个布尔值,是或不是垃圾信息。如果遇到"是垃圾信息",接下来的做法并非直接将其忽略,而是转入论坛的"回收站"或"垃圾箱",这样还有机会对其进行观察、恢复。
之所以说这个方法不是很好,是因为这些第三方检测网站,通常是针对非中文内容进行判定的,它们的中文分词、处理能力还有待提高;另一方面就是在用户发文的时候,第三方检测是个耗时的等待过程,会增加用户发文后的等待时间,若再遇到网络中断(毕竟是问询海外服务器),则会导致用户发帖失败。
三、内容的二次发布与检测:
这个方法有些灰帽的味道,对于喜欢SEO的站长,可能有一箭双雕的功效,这个方法是从上面第二点衍生出来的。第二点所说的将文章送入第三方检测服务器,只要替换成将文章送入国内某主流专栏服务商,即可实现一箭双雕的效果。
具体做法是在用户发文的时候,将文章同步发送到搜狐、新浪、百度空间等类似的博客专栏中,然后判断文章是否被成功发出了,如果他们对于文章的审核结果是肯定的,你也可以对其进行肯定;若这些地方对文章内容否定了,则说明文章内容有悖相关政策了。
为什么说是一箭双雕呢?原因是在同步发文的时候,可以对文章正文、也就是content字段追加一段转载声明,提示文章的第一出处在论坛上,这样成功发布出去的文章中,都会带有一个反向链接指回自己的论坛,这相当于为论坛内容做站外同步博客映像。
这个方法和第二个方法一样存在着缺陷,虽然国内主机连接速度和相应不成问题,但国内过于严格的审核机制可能会导致更多的误判、同时似乎百度空间已经增加了发帖验证和禁止正文包含网址等规则,所以这个方法的可行性已经降低了。
四、文章内容的相似度计算:
对于论坛而言,试想一种情况:某个新用户到论坛来发帖、一上来就来转载一篇已经在网络上转载烂了的文章,这种情况会发生在什么情况下呢?我认为这种情况只会发生在广告群发上,常规的用户注册之后或发问、或回帖,很少一上来就转载内容的。
发问的是否用户也许已经在多个论坛上询问了同样的问题了,但这样的用户和广告群发在行为上已经没有本质不同了,所以对于这样的用户也是不被欢迎的。
基于此,便可对用户文章在网络上出现的频度进行查询判定,若某用户的处女帖是带有网址或站外引用图片的转载帖,则不予考虑通过,直接将其文章归入回收站、账户暂时冻结即可。
对于文章相似度和是否在网络上频繁转载两个计算,则是利用搜索引擎来完成的了。最为简单的做法是将用户的帖子标题当作搜索内容进行搜索,观察搜索结果数量即可。
五、发帖时间推测与打字速率计算:
这个方法是mylot等网站使用的方法,依据是真实用户从点击完"发帖"按钮到完成发帖过程,中间是需要时间且时间是根据帖子内容字数所确定的。真实的用户不可能瞬间完成100字的输入,他至少需要个十几秒的时间,对于2000字则可能需要几分钟的时间才能完成输入。
这个验证虽然是科学的,但是它同样存在着缺陷----没有考虑用户通过复制、粘贴来进行发帖。例如我在写这篇文章的时候,其实是先用记事本来写、写好了粘贴到论坛中,所以虽然文章看上去字数很多,但发帖过程却很短。
所以这个方法是个辅助手段,并不能被当作绝对判定来使用。但这个方法的前一个判定是完全可以做为权重比较大的判断依据的,因为用户在每个页面的停留时间、鼠标点击位置等不会完全相同,所以对于点击"发帖"按钮的坐标是否存在、是否随机等均可做为参数进行判断。
六、还有更多的方法:
对于论坛垃圾信息的验证和判断,我做了大约13种不同的验证机制,每一个验证机制根据其准确性和成本给予一个不同的权重,当一个用户、一篇帖子被发送上来的时候,会先去决定采用这些验证方法中的哪几个,然后综合每一个验证得到的结论,最终判定这篇文章是否属于垃圾邮件。
如此的验证让我相信可以有效杜绝垃圾信息、又不会让用户在发帖的时候进行等待、验证。限于其中的一些方法过于投机,这里不便一一列出。
俗话说是骡子是马出来溜溜,对于我所谓的垃圾邮件过滤与屏蔽机制是否有效,还需要时间的验证,前几天自己部署了一个DZ的论坛,以期用来检验、测试这些屏蔽垃圾信息的方法。
欢迎来讨论、测试。论坛地址:http://www.s9600.com/bbs/
点击这里参与本文讨论