当MT-BlackList,MT-Bayesian,MT-SCode,MT-DSBL 都无效时



为了在 google 中取得更高的 Page Rating 值,很多网站想方设法的在网络中留下自己痕迹,我们这些用MT的人就成了无辜的牺牲者。只需要找到 mt-comments.cgi 的位置,就可以利用程序(机器人)来张贴广告了。我的 blog 在一段时间之后也开始受到 spam 的骚扰。

如今 Six Apart 终于也坐不住了,推出了官方版的反 spam 指南
而非官方的指南也有很多:这里(英文),这里(中文)
网络上通常采用的防止 spam 的方法有以下几种:

1.修改 mt-comments.cgi 的名称

将 mt-comments.cgi 改名,然后把 /lib/MT/ConfigMgr.pm 中
$mgr->define(’CommentScript’, Default => ‘mt-comments.cgi’);
这一行作相应修改并 Rebuild Site 即可

我以前采用的就是这个方法,相当简单,效果也不错,但最近有些机器人开始变聪明了,能通过分析页面,得到修改过之后的文件名。于是 spam 陆陆续续的出现在 blog 里

2.使用著名的插件 MT-BlackList

将已知的广告机器人列入黑名单,不允许其发表评论。

可惜不知道哪儿出了问题,这一插件在我用的虚拟主机上始终无法正常工作

3.另一个插件 MT-Bayesian

思路相当先进,利用在阻止垃圾邮件时常使用的贝叶斯算法,可以让 MT 逐渐的“学习”并识别 spam,据说经过数次的学习后就能准确的识别出 spam 了。

可惜又不能正常工作!似乎和 MT 3.X 之间有点兼容问题,而网上并没有提到过啊?很奇怪。

4.校验码插件 MT-SCode

每次发表回复时都要求根据随机图片输入一个校验码。

MD,又不能工作!我已经出离愤怒了!这个虚拟主机商的系统不支持 gd.pm!可是我使用的 n@log Analyzer 明明就用到了 GD 啊?!百思不得其解!!

5. 插件 MT-DSBL

根据发表评论者的 IP 来判断是否使用了公开的代理,而这通常是 spam 机器人的特征

安装过程是所有插件里最简单的一个。安装好之后的15分钟内,blog 里又多了两条 spam - -b
有点不信邪,把第一个方法中曾经改名的 mt-comments.cgi 改回了原名。一天之后,多出来40多条 spam ……
无语了。

以上内容花了我近一整天的时间,全部无效
好在后来终于找到了解决方法:

来源:CATHOME01.COM搜索引擎研究

方法一:回复中必须包含非英文字母
在 mt-comments.cgi 中
use strict;
下增加如下内容

use CGI qw(:standard);
if ($ENV{’REQUEST_METHOD’} eq “POST”) {
my $tck = param(’text’);
die if($tck ne “” && $tck !~ /[\x80-\xff]/);
}

说明:若回复中全部为英文字母或数字,则不允许发表。目前的机器人都是国外的,spam 自然全部都是英文,那就有杀错无放过,统统不允许!!不知道等国人也开发出自己的机器人后,我们又该怎么办……

方法二:回复中必须包含全角的逗号(,)或句号(。)

use CGI qw(:standard);
my $sc_tx = param(’text’);
use Jcode;
Jcode::convert(\$sc_tx,’sjis’);
die if($sc_tx ne “” && $sc_tx !~ /\x81(\x41|\x42)/);

方法三:回复中汉字必须连续出现

use CGI qw(:standard);
my $sc_tx = param(’text’);
my @sc_s;
my $sc_n= 2;
my $sc_m= 2;
use Jcode;
Jcode::convert(\$sc_tx,’sjis’);
@sc_s = $sc_tx =~ /(\x82[\xa0-\xf2]|\x81\x5b){$sc_n,}/g;
die if($sc_tx ne “” && scalar(@sc_s)<$sc_m);

$sc_n:汉字连续出现的最小字数
$sc_m:汉字出现在不同位置的最小次数

方法四:回复中链接个数限制

use CGI qw(:standard);
if ($ENV{’REQUEST_METHOD’} eq “POST”) {
my $tck = param(’text’);
die if($tck ne “” && $tck !~ /[\x80-\xff]/);
# 以上判断是否是中文留言
my $ncom = 0;
while ( $tck =~ /http/g ) { $ncom ++ ; }
die if( $ncom > 1 );
# 以上判断有多少个URL出现
}

$ncom 就是计算里面的联接个数,如果大于1,就当做垃圾留言了

目前我使用的是方法一,经测试有效!好在大家回复时都用的中文,应该不会有问题,呵呵。

5 Related Posts

  • MT-Blacklist 的要求
  • Leave a Reply