自从把我blog迁至专用服务器上,访问率不断提升,但同时增加的是烦人的垃圾广告,常称为spam信息。
就blog而言,这类信息主要通过2种途径传播
其中,第一种是最直观的spam传播方式,也是比较常见的,至于第二种,利用文章的trackback来做spam,这不禁令我赞叹人类智慧的伟大!
和垃圾邮件一样,目前自然语言处理还没达到一定的高度,自然没有什么很有效的办法杜绝这类信息。不过作为一个站长,看着这些恶心的东西贴在自己网站上实在是受不了。
为此我最早采取的方式是关键字过滤,但防不胜防...最后发展出下面2招,供各位参考:
对付评论:
思想:由于一般spam是推销产品、网站为目的,其中自然少不了链接与网址,不过链接标签不是必要的,但网址(严格说是URL)一般是必须的。所以突破口就在其中。
方案:对于留言作关键字过滤,将"http://"作为关键词,如果发现有这个关键词,则禁止发送留言。这样基本上就不会有第一类spam干扰你了。
对付引用:
要知道,既然是trackback,那么url是必须的,而且自动会加上链接...这也是那些spamer的狡诈之处,上面的办法自然是无效了
不过也有解决之道(不讨论关闭trackback的方案):
1.只有本blog注册用户才能获取trackback地址
好处:可以比较有效杜绝此类spam,缺点:并不是人人都愿意为了做个处于良心(至少国人不大愿意作trackback的,可能我有些偏见)的trackback特地来你这注册
2.动态生成trackback地址
我之前在网上看过具体例子,大家可以找下,那人提供方法的。
实现起来比较复杂,为了做到每次产生的地址不同,要做很复杂的后台跟踪,而且网上有人实现的方案是一个trackback地址在24小时后自动失效...
这招绝对很有效,不过我实在没这个功夫..
3.作trackback地址变换
此话怎讲?下面我来分析下spam的特点:
不要以为那些发送spam的人有很好的耐心给你blog每篇文章手工去发那些trackpost。他们一般都使用外面流行的spam群发工具。
我没有具体研究过,如果要我编写,一般会遵循这个原则:
一般trackback地址的格式为http://xxxblog.xx.com/trackback.asp?id=xxx&....
是不是这样?在那个trackback.asp后面跟的querystring里面一般总会含有id这类的信息的,这是必须的,因为blog要知道是对哪篇文章作了trackback。
好,现在我们要做群发软件,所谓群发,就是一次性给一个blog发很多有效的spam,这自然不可能要发送者去提供每个页面的trackback地址了,往往软件会找出每篇trackback地址的规律:
太简单不过了,因为一般id就是一个数字,而且文章id都是连续的,那么直接循环发送就好了,比如:
for (int id=0;id<maxid;id++)
{
CString url;
url.Format("http://xxxblog.xx.com/trackback.asp?id=%d",id);
sendspam(url);
}
所以我们的突破口就是在把这个id值变成不能用上述代码枚举的形式
这里介绍我目前采用的办法:把每个数字用对应的罗马字表示:
1->I ,2 -> II , 6 -> VI 等
这样,诸如id=53的形式可以变换到:id=V,III
现在我们考虑上面算法,虽然要写一个枚举这样id的程序实在很容易,但spam群发器的作者不会就为了这个情况特地去写这个算法吧。
而且对自己来说实现起来也很容易。
还有可以把数字用大写中文表示,或者英文,哈哈,就看各位想象了!
这个办法虽然不能绝对防止spam发作,但要知道在这个浮躁的社会,那些spamer们自然不会有工夫去研究你的算法的...