又发现一个防垃圾留言的东东:WP Anti Spam 小牆 1.8 » 荒野无灯weblog

Keep It Simple, Stupid.

荒野无灯weblog

又发现一个防垃圾留言的东东:WP Anti Spam 小牆 1.8

话说今天去万戈的博客转了下,还真发现了不少好东东,于是毫不犹豫地在google reader里订阅了他的博客,哈哈。
万戈在博客中说到一个由wllin同志写的小东东:WP Anti Spam 小墙1.7 。地址:http://kan.willin.org/?p=1267
使用方法是将下列代码附加到你目前使用的主题下的functions.php文件最后,
其全部代码如下:

/* -----------------------------------------------
<<小牆>> Anti-Spam v1.7 by Willin Kan.
 *http://willin.atbhost.net/?p=1267
*/
//建立
class anti_spam {
function anti_spam() {
if (!current_user_can('level_0')) {
add_action('template_redirect',array($this,'w_tb'),1);
add_action('init',array($this,'gate'),1);
add_action('preprocess_comment',array($this,'sink'),1); } }
//設欄位
function w_tb() {
if (is_singular()) {
ob_start(create_function('$input','return preg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)#","textarea$1name=$2w$3$4
",$input);'));
} }
//檢查
function gate() {
if (isset($_POST['w']) && !empty($_POST['w']) && empty($_POST['comment'])) {
$_POST['comment']= $_POST['w'];unset($_POST['w']);
} else {$_POST['spam_confirmed'] = 1;}
}
//處理
function sink($comment) {
if (isset($_POST['spam_confirmed']) && !empty($_POST['spam_confirmed'])) {
//方法一:直接擋掉, 將 die(); 前面兩斜線刪除即可.
//die();
//方法二:標記為spam, 留在資料庫檢查是否誤判.
add_filter('pre_comment_approved',create_function('','return "spam";'));
$is_ping = in_array($comment['comment_type'], array('pingback', 'trackback'));
if ($is_ping) {
$comment['comment_content'] = "◎ 這是 Pingback/Trackback, 小牆懷疑這可能是 Spam!\n" .$comment['comment_content'];
} else {
$comment['comment_content'] = "[ 小牆判斷這是Spam! ]\n" .$comment['comment_content'];
}}
return $comment;
}}
$anti_spam = new anti_spam();
// -- END ----------------------------------------

我猜这个小墙的原理可能是这样的:
在模模中插入一个名为 w的textarea ,然后隐藏了原来那个名为comment的textarea ,由于垃圾留言发送的软件一般只知道向comment这个变量提交内容,这样就会导致w为空而comment有内容,由此可判断这不是人在提交数据,而是批量发垃圾留言的软件或机器。
不知我分析得有没有道理? 我博客也有一个方法与此类似,不过比这个麻烦一点:五分钟杜绝垃圾评论。这两个方法原理几乎是相同的。所以目前我没有用这个小墙。
据sorrydreams反映,这个代码和wp-thread-comments有冲突,表现为第一个评论时没问题,但第二个就会出现comments cannot be empty的错误。
作者给出的解决办法是:

 //在 wp-thread-comment.js.php 第 253, 255 行 增加 w 的判斷.
comment = stpm("comment",q); w = stpm("w",q); //丟進 w 欄內容
if(( comment == null || comment == "" )&&( w == null || w == "" )){
//因小牆增了一欄 w, 所以也要檢查 w 欄不為空.

小墙升级版:1.8版

/* -----------------------------------------------
<<小牆>> Anti-Spam v1.8 by Willin Kan.
*/
//建立
class anti_spam {
function anti_spam() {
if ( !current_user_can('level_0') ) {
add_action('template_redirect', array($this, 'w_tb'), 1);
add_action('init', array($this, 'gate'), 1);
add_action('preprocess_comment', array($this, 'sink'), 1);
} }
//設欄位
function w_tb() {
if ( is_singular() ) {
ob_start(create_function('$input','return preg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)/textarea>#",
"textarea$1name=$2w$3$4/textarea>",$input);') );
} }
//檢查
function gate() {
( !empty($_POST['w']) && empty($_POST['comment']) ) ?
$_POST['comment'] = $_POST['w'] : $_POST['spam_confirmed'] = 1;
}
//處理
function sink( $comment ) {
if ( !empty($_POST['spam_confirmed']) ) {
//方法一:直接擋掉, 將 die(); 前面兩斜線刪除即可.
//die();
//方法二:標記為spam, 留在資料庫檢查是否誤判.
add_filter('pre_comment_approved', create_function('','return "spam";'));
$is_ping = in_array( $comment['comment_type'], array('pingback', 'trackback') );
$comment['comment_content'] = ( $is_ping ) ?
"◎ 這是 Pingback/Trackback, 小牆懷疑這可能是 Spam!\n" . $comment['comment_content'] :
"[ 小牆判斷這是Spam! ]\n" . $comment['comment_content'];
}
return $comment;
} }
$anti_spam = new anti_spam();
// -- END ---------------------------------------- 

Tagged in : 防spam,spam,killspam,小墙

All Comments (0)
Gravatar image
No Comments