首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

WordPress 垃圾評論攔截實戰:純代碼屏蔽英文/中文 Spam、IP 黑名單與蜜罐技術

     編輯:PHP 綜合知識

垃圾評論不僅污染數據庫,更消耗伺服器資源。本文提供三層防禦體系:關鍵字過濾攔截機器人批量發送的英文/中文 Spam、蜜罐陷阱識別自動化腳本、IP 黑名單封禁惡意來源,均無需安裝外掛,直接放入主題 functions.php 即時生效。

第一層:強制評論包含中文(攔截純英文 Spam)

絕大多數機器人發送純英文內容。利用 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();

第三層:IP 黑名單(封禁惡意來源)

在網站根目錄 .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蜜罐陷阱自動化腳本極低(真人不觸發)零
3IP 黑名單持續攻擊源中(誤封共用 IP)低(定期清理)
輔助時間戳極簡單腳本低零

建議啟用第 1、2 層作為基礎防線,第 3 層針對日誌分析出的高頻攻擊 IP 精準封禁。組合拳下,Spam 入庫率可降至 0.1% 以下。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved