现在的位置: 首页 > Wordpress > 正文

WordPress Anti Spam 小墙

2011年02月19日 Wordpress ⁄ 共 2697字 ⁄ 字号 暂无评论

Willin Kan大师提供的WP Anti Spam 小墙代码

小牆 1.81 是 小牆 1.8 的修改版, 不是升级版.

在原功能不变的基础下, 改动两个地方:

一、取消了 Trackbacks/Pingbacks 的拦劫.

二、将 spam 的基本资料存进档头.

ps. 2010/12/16 最新修改, 是 1.82 版.

将下列代码 copy 到模板的 functions.php

  1. /* <<小牆>> Anti-Spam v1.82 by Willin Kan. 2010/12/16 最新修改 */  
  2.  //建立   
  3. class anti_spam {   
  4.   function anti_spam() {   
  5.     if ( !current_user_can('level_0') ) {   
  6.       add_action('template_redirect', array($this, 'w_tb'), 1);   
  7.       add_action('init', array($this, 'gate'), 1);   
  8.       add_action('preprocess_comment', array($this, 'sink'), 1);   
  9.     }   
  10.   }   
  11.   //設欄位   
  12.   function w_tb() {   
  13.     if ( is_singular() ) {   
  14.       ob_start(create_function('$input','return preg_replace("#textarea(.*?)name=([\"\'])comment([\"\'])(.+)/textarea>#",   
  15.       "textarea$1name=$2w$3$4/textarea><textarea name=\"comment\" cols=\"100%\" rows=\"4\" style=\"display:none\"></textarea>",$input);') );   
  16.     }   
  17.   }   
  18.   //檢查   
  19.   function gate() {   
  20.     if ( !emptyempty($_POST['w']) && emptyempty($_POST['comment']) ) {   
  21.       $_POST['comment'] = $_POST['w'];   
  22.     } else {   
  23.       $request = $_SERVER['REQUEST_URI'];   
  24.       $referer = isset($_SERVER['HTTP_REFERER'])         ? $_SERVER['HTTP_REFERER']         : '隱瞞';   
  25.       $IP      = isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? $_SERVER["HTTP_X_FORWARDED_FOR"] . ' (透過代理)' : $_SERVER["REMOTE_ADDR"];   
  26.       $way     = isset($_POST['w'])                      ? '手動操作'                       : '未經評論表格';   
  27.       $spamcom = isset($_POST['comment'])                ? $_POST['comment']                : null;   
  28.       $_POST['spam_confirmed'] = "請求: "$request"\n來路: "$referer"\nIP: "$IP"\n方式: "$way"\n內容: "$spamcom"\n -- 記錄成功 --";   
  29.     }   
  30.   }   
  31.   //處理   
  32.   function sink( $comment ) {   
  33.     if ( !emptyempty($_POST['spam_confirmed']) ) {   
  34.       if ( in_array( $comment['comment_type'], array('pingback', 'trackback') ) ) return $comment//不管 Trackbacks/Pingbacks   
  35.       //方法一: 直接擋掉, 將 die(); 前面兩斜線刪除即可.   
  36.       //die();   
  37.       //方法二: 標記為 spam, 留在資料庫檢查是否誤判.   
  38.       add_filter('pre_comment_approved', create_function('', 'return "spam";'));   
  39.       $comment['comment_content'] = "[ 小牆判斷這是Spam! ]\n"$_POST['spam_confirmed'];   
  40.     }   
  41.     return $comment;   
  42.   }   
  43. }   
  44. $anti_spam = new anti_spam();   
  45. // -- END ----------------------------------------  

小牆 1.81 的速度是没什麽差别.

因为有人提议 Trackbacks/Pingbacks 不需拦劫, 1.81 就是为此而修改, 用了 1.81 可要自己当心了. 还好, 现在的 Trackbacks/Pingbacks 的 spam 没有以前那麽猖獗, 这大可放心.

最大重点是加入了 spam 的基本资料, 包含请求( REQUEST_URI )、来路( HTTP_REFERER )、IP、操作方式, 可提供下一步加强防护的参考.

例:

如果你用的是我的 WordPress 内置嵌套评论专用 Ajax comments, 那麽 '请求' 应该是你主题路径的那个 comments-ajax.php, 而不应该是根目录的那个 wp-comments-post.php, 你可大胆把 wp-comments-post.php 文件更名, 让他没门进来. 但用了这方法, 垃圾评论一条也没有, 短时间还真会让你有些不习惯.

'来路' 通常可以经过伪造, 较不可信, 仅供参考.

虽然 WordPress 在后台可看到 spam 的 IP, 倘若通过代理就不一样了, 小牆所记录的是代理之前的 IP, 除非他用高匿名代理, 那就真的无法得知了.

给我留言

留言无头像?


×