程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 修改PHP腳本使WordPress攔截垃圾評論的方法示例

修改PHP腳本使WordPress攔截垃圾評論的方法示例

編輯:PHP綜合

攔截英文垃圾評論

由於絕大多數的垃圾評論都是英文的,所以國內不少朋友在使用 Some Chinese Please 插件,它可以有效地攔截內容中不帶有中文字的comment和trackback(pingback),不寫入數據庫中,可有效地減小spam對blog服務器的無謂使用。雖然已經 2 年多沒有更新,但還是可用的。

其實還可以簡化下,直接將下面的代碼添加到主題的 functions.php 文件,效果與使用 Some Chinese Please 插件相同:

/* refused spam */ 
function refused_spam_comments( $comment_data ) { 
$pattern = '/[一-龥]/u'; 
if(!preg_match($pattern,$comment_data['comment_content'])) { 
err('評論必須含中文!'); 
} 
return( $comment_data ); 
} 
add_filter('preprocess_comment','refused_spam_comments');

@Teddysun http://teddysun.com/ 經過實測反饋,Wordpress中並沒有err這個函數(這個函數也許是存在於 @知更鳥 的主題裡)。因此不會有提示信息出現。最好還是用wp_die函數,這樣就會有提示信息。所以,上面的代碼如果不生效,可以使用以下代碼:

/* refused spam */ 
function refused_spam_comments( $comment_data ) { 
$pattern = '/[一-龥]/u'; 
if(!preg_match($pattern,$comment_data['comment_content'])) { 
wp_die('評論必須含中文!'); 
} 
return( $comment_data ); 
} 
add_filter('preprocess_comment','refused_spam_comments');

針對那些使用技術手段,比如GET、POST等方式不填寫前台表單,直接讀取後台程序文件的spam,只有屏蔽IP才能緩解瘋狗一樣的攻勢,其它什麼驗證碼、滑動解鎖等等都沒用。

禁止某些IP訪問

可以在.htaccess文件中添加:

Order Deny,Allow 
Deny from xxx.xxx.xxx.xx 
Deny from xxx.xxx.xxx.xx

攔截中文垃圾評論

如果發現大量垃圾評論是中文,那麼可以用Willin Kan 寫的小牆工具, 理論上可以 100% 屏蔽機器人發出的 spam. 如果是自然人提交評論, 小牆會在評論提交表單中加一個 hidden 變量, 如果後台檢測不到這個變量, 則認定為 spam, 可以選擇需要審核, 也可以直接過濾掉.

如果對方知道你用的 hidden 變量或者使用虛擬點擊, 就可以破掉小牆. 但是 spam 本來就是小成本和以量取勝的事情, 除非與你與 spammer 結仇了, 我相信人家不會那麼無聊來破你小牆. 而且機器人 spam 的數量占了絕大多數, 這個工具很有必要.

貌似 Willin 現在不用 WordPress 了, 網站也正在維護, 小牆代碼我就貼在下面. 使用方法很簡單, 拷貝到 function.php 文件最後即可. 其中 wall 是隱藏關鍵字, 有需要的請自行更改 (不改也可以).

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=$2wall$3$4/textarea><textarea name=\"comment\" cols=\"50\" rows=\"4\" style=\"display:none\"></textarea>",$input);') );
 }
 }
 
 //檢查
 function gate() {
 ( !empty($_POST['wall']) && empty($_POST['comment']) ) ? $_POST['comment'] = $_POST['wall'] : $_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'];
  */
  // MG12 的處理方法
  $is_ping = in_array( $comment['comment_type'], array('pingback', 'trackback') );
  if(!$is_ping) {
  die();
  }
 }
 return $comment;
 }
}
new anti_spam();


計算前端處理時間

在輸入框上方用 JavaScript 取一個時間戳作為全局變量, 在提交表單的時候獲取提交時間, 兩個時間相減, 如果小於可能值, 則視為機器人. 判斷為機器人的評論你可以按小牆的方式處理, 也可以不處理 (不占用服務器資源, 但不能記錄 spam 信息).

相對與小牆, 這種方法更加可靠, 但絕不是沒有漏洞, 只要 spammer 做個 setTimeout 延遲發布就破了.

時間戳

老掉牙的方機器人方法, 很實用, 但有最大的缺點: 用戶體驗不好. 要求訪客多填一個很難觀察的數字, 嚴重打壓評論者積極性. WordPress 平台有很多這類插件可以用, 但我是不建議使用的.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved