垃圾評論不僅污染數據庫,更消耗伺服器資源。本文提供三層防禦體系:關鍵字過濾攔截機器人批量發送的英文/中文 Spam、蜜罐陷阱識別自動化腳本、IP 黑名單封禁惡意來源,均無需安裝外掛,直接放入主題 functions.php 即時生效。
絕大多數機器人發送純英文內容。利用 preprocess_comment 鉤子檢查內容:
// 正確版:使用 wp_die() 返回友好錯誤提示
function refuse_spam_comments( $comment_data ) {
// 正則匹配任意中文字符(Unicode 範圍:4E00-9FA5)
$pattern = '/[\x{4e00}-\x{9fa5}]/u';
if ( ! preg_match( $pattern, $comment_data['comment_content'] ) ) {
wp_die( '評論必須包含中文字符!', '評論失敗', array( 'response' => 400 ) );
}
return $comment_data;
}
add_filter( 'preprocess_comment', 'refuse_spam_comments' );
關鍵點:早期網傳代碼使用 err() 函數,實際不存在,會導致白屏無提示。必須用 wp_die() 正確終止並輸出錯誤頁面。
原理:在表單隱藏一個真正的 comment 輸入框(CSS 隱藏),顯示一個名為 wall 的假輸入框。真人瀏覽器不會填寫隱藏框,機器人傾向填寫所有 name="comment" 欄位。後端檢測:若 $_POST['comment'] 有值但 $_POST['wall'] 為空 → 判定為 Spam。
class Anti_Spam {
function __construct() {
if ( ! current_user_can('level_0') ) { // 僅對非登入用戶啟用
add_action('template_redirect', array($this, 'ob_start_trap'), 1);
add_action('init', array($this, 'gate_check'), 1);
add_action('preprocess_comment', array($this, 'sink_spam'), 1);
}
}
// 1. 輸出緩衝替換表單:將真 comment 框隱藏,插入壁壘欄位 wall
function ob_start_trap() {
if ( is_singular() ) {
ob_start( function( $input ) {
return preg_replace(
'#(<textarea[^>]*name=["\']comment["\'][^>]*>)(.*?)(</textarea>)#is',
'$1$2$3<textarea name="comment" cols="50" rows="4" style="display:none"></textarea><textarea name="wall" cols="50" rows="4"></textarea>',
$input
);
});
}
}
// 2. 閘檢:若 wall 有值且 comment 為空 → 視為真人,交換值
function gate_check() {
if ( ! empty($_POST['wall']) && empty($_POST['comment']) ) {
$_POST['comment'] = $_POST['wall'];
} else {
$_POST['spam_confirmed'] = 1; // 標記可疑
}
}
// 3. 沉底處理:標記為 spam 或直接阻斷
function sink_spam( $comment ) {
if ( ! empty($_POST['spam_confirmed']) ) {
// 方案 A:直接阻斷(刪除下行註釋啟用)
// wp_die( '疑似垃圾評論已攔截。' );
// 方案 B:標記為 spam 留存資料庫供人工覆核(推薦)
add_filter('pre_comment_approved', function() { return 'spam'; });
// 保留原內容並加註標記
$is_ping = in_array( $comment['comment_type'], array('pingback', 'trackback') );
if ( ! $is_ping ) {
$comment['comment_content'] = '[蜜罐判定為 Spam] ' . $comment['comment_content'];
}
}
return $comment;
}
}
new Anti_Spam();
在網站根目錄 .htaccess 添加:
Order Deny,Allow Deny from 192.168.1.100 Deny from 10.0.0.0/8 Deny from 203.0.113.0/24
支援單一 IP、CIDR 網段。配合日誌分析工具(如 Fail2Ban)可實現自動封禁。
頁面載入時記錄 Date.now(),提交時比較間隔。若 < 3 秒視為機器人。繞過手段:攻擊者可加 setTimeout 延遲提交,故只能作輔助,不可單獨依賴。
嚴重損害用戶體驗,降低真實評論率。現代機器人可通過 OCR 或第三方打碼平台破解,投入產出比極低。
| 層級 | 手段 | 攔截對象 | 誤傷風險 | 維護成本 |
|---|---|---|---|---|
| 1 | 中文強制 | 純英文機器人 | 低(外語用戶需適應) | 零 |
| 2 | 蜜罐陷阱 | 自動化腳本 | 極低(真人不觸發) | 零 |
| 3 | IP 黑名單 | 持續攻擊源 | 中(誤封共用 IP) | 低(定期清理) |
| 輔助 | 時間戳 | 極簡單腳本 | 低 | 零 |
建議啟用第 1、2 層作為基礎防線,第 3 層針對日誌分析出的高頻攻擊 IP 精準封禁。組合拳下,Spam 入庫率可降至 0.1% 以下。