再次说说Blog的人身安全

上次写了一篇文章叫“Blog的人身安全”。今天月光博客又发表了一篇文章,提到了Trakcback的问题。今天就再次来谈谈我在反SPAM上的一些小招数。

1.首先要做到的,也是最简单能做到的,就是将Trackback地址复杂化。
回顾今年3月份的Donews Trackback SPAM事件,正是因为Donews的Trackback地址采用了连续的ID作为Trackback的URL,所以才会使系统变得易被攻击。(话说Donews现在的TB URL貌似依然是连续ID,比如:http://tb.donews.net/TrackBack.aspx?PostId=930641)
一个方法是在TB URL中加入验证字串,比如tb.php?id=123&auth=78q34f,验证字串的算法可以使用标题或者文章内容的MD5 Hash中的一部分来充当。然而,这样增加了URL的长度和本来不应该有的信息量,似乎并不是最好的办法。那么,我们为什么不连ID一起加密掉呢?
我的做法是采用一个可逆加密算法(目前Waki-Blog使用的是我自己写的z-Enc),加密URL中的ID,Trackback程序收到字符串之后,解密、验证,若合格则继续,不合格则拒绝。同时起到了提高URL复杂度、隐藏ID、验证提交的作用。我的Blog中的TB URL中类似“response.php?tb::0a2MTc%3D”的部分,就是z-Enc编码的结果。
z-Enc的详细说明和源代码都可以在上面的链接中找到,希望能给Blog程序的作者们提供一丁点思路。

2.进行敏感关键词过滤。
为了进一步防止通过人工方式对某个Blog(甚至某个Blog系统)进行某些有“特殊目的”的SPAM,需要对Trackback以及留言评论的内容进行过滤。具体到程序上,就是检查接收到的信息中是否有规定的词汇。再细分,则是检查敏感词汇出现的次数是否超过了规定的次数(即敏感度,或者说宽容度)。如果出现违规的词汇,则予以拒绝。
为什么要采用一个“宽容度”设定呢?请看下面两句话:“Google Earth是Google提供的免费地图服务”、“免费激情小电影 观看免费电影”。同样是“免费”这个词语,出现在正常的句子当中和出现在广告SPAM中的频率是不同的。经过观察,在正常句子中“免费”出现的频率较小,而出现在广告中的时候则很可能大量出现。若没有宽容度,只要出现“免费”就一律杀掉,未免错杀无辜;若不过滤,则很可能漏掉广告。
下面是Waki-Blog的过滤代码:
function bad_word_detect($str){
include_once("./include/badword.php");
//英语垃圾词检查
$message_for_check_en = str_word_count(strtolower(preg_replace('~[^A-Z ]~i', '', $str)),1);
if(count(array_intersect($message_for_check_en,$bad_word_en)) > 0) return true;

//中文垃圾词检查
$message_for_check_cn = str_replace($bad_sign,"",preg_replace('~[A-Za-z0-9 ]~i', '', $str));
for ($i=0;$i<count($bad_word_cn);$i++){
if (substr_count($message_for_check_cn, $bad_word_cn[$i][0]) >= $bad_word_cn[$i][1]) {
return true;
}
}
}
Waki-Blog分别对英文和非英语敏感词汇进行过滤。敏感词汇列表储存在badword.php中,可以随时扩充。
(1)英文关键字过滤:
首先使用正则表达式过滤掉除大小写英文字母外的全部字符。之后使用PHP内建函数strtolower将全部字母转换为小写(防止使用类似pORn的乱序大小写来蒙混过关)。之后用str_word_count来分词,全部词语转换为数组$message_for_check_en,之后用array_intersect求其与$bad_word_en数组的交集,若存在交集,则判断内容中包含敏感词语,函数返回true。
(2)中文关键词过滤:
比起英文关键词过滤,因为中文关键词过滤引入了宽容度问题,所以要稍微复杂一些。
首先将所有的英文字母、0~9的阿拉伯数字、英文符号、中文符号都过滤掉组成纯非英语字符串$message_for_check_cn。之后进入循环,逐个检查每个敏感关键词在字符串中的含量。若发现超过宽容度的出现次数,则立即返回true中止循环。
这种方法虽然有些花费系统资源,但是过滤效果和灵活度方面都好一些。而且,这种方式的应用不仅限于此,如果将某些经常发广告的网站的网址列入敏感字符列表中,将容忍度设置为1(只要出现一次就block),那么敏感字符列表便充当了黑名单的作用。
当然,这种过滤方式当然也存在一些不足。比如无法防止汉字同音字代替,偏旁部首拼字等等的比较极端的办法,但防护一般的SPAM还是足够的。因为语言天生的复杂性,除非使用机器分词、语法语义分析、统计学分析过滤等等的技术,SPAM是没办法从根本上过滤的。然而遗憾的是,目前这些技术本身就不是很成熟,应用在SPAM过滤上就更有难度了。

越高级复杂的过滤与防护只能催生出来更加变本加厉的SPAM办法。在想办法不断对付没完没了的SPAM的同时,为什么不倡导响应中央“文明办网”的号召,让广大网站的发展都“文明”起来,不要SPAM呢?

话题:互联网与IT Waki-Blog

引用通告(TrackBack):http://www.williamlong.info/cmd.asp?act=tb&id=547

再次说说Blog的人身安全有 0 条回应

发表回应

 
如果您是注册用户,请先登录。
昵称 (*)
E-Mail (*)
(不会公开)
网站
留言 (*)
悄悄话
有(*)标记的是必填项目。