個人部落格常面臨垃圾留言氾濫問題:不僅佔用資料庫空間,大量機器人流量還會消耗伺服器資源。本文整合四層防禦策略,能有效攔截 99% 以上的垃圾留言,且不影響正常使用者留言。
早期做法是將 wp-comments-post.php 改名,並在主題 comments.php 中同步修改表單 action。但現代垃圾機器人可直接解析表單 action 或模擬瀏覽器行為,**此方法已基本失效**,不建議單獨依賴。
大量垃圾留言為純英文/數字/符號,正常中文部落格留言幾乎都包含中文字。在主題 functions.php 加入:
策略四:過濾日文垃圾留言 (補強)
部分垃圾留言改用日文假名繞過中文檢測。針對常見日文假名/漢字加入黑名單:
完整整合代碼 (functions.php)
2000) { wp_die('留言內容過長!'); } return $comment; }, 30); // 4. 同一 IP/用戶頻率限制 (需配合快取或資料表) add_filter('preprocess_comment', function($comment) { $ip = $_SERVER['REMOTE_ADDR']; $key = "comment_rate_limit:$ip"; // 這裡需實作快取邏輯,例如 Redis/Memcached // if (cache_get($key)) wp_die('留言太頻繁,請稍後再試'); // cache_set($key, 1, 60); // 60 秒內只能留言一次 return $comment; }, 40);進階建議:結合其他防禦層
| 層級 | 方案 | 說明 |
|---|---|---|
| 網路層 | Cloudflare / WAF | 擋惡意 IP、國別封鎖、速率限制、JS 挑戰 |
| 應用層 | reCAPTCHA v3 / hCaptcha | 無感驗證,根據分數判斷機器人機率 |
| 表單層 | 蜜罐欄位 (隱藏 input) | 機器人會填寫隱藏欄位,正常用戶看不見 |
| 內容層 | Akismet + 本文策略 | 語義分析 + 規則過濾雙重保障 |
| 資料層 | 定時清理垃圾留言表 |
// 在 comments.php 表單中加入 (CSS 隱藏)
<input type="text" name="website" id="website" value="" tabindex="-1" autocomplete="off" style="display:none;">
// 在 functions.php 驗證
add_filter('preprocess_comment', function($comment) {
if (!empty($_POST['website'])) {
// 機器人填寫了隱藏欄位
wp_die('偵測到自動化程式');
}
return $comment;
});
垃圾留言防禦沒有銀彈,**多層疊加**才是王道:
根據網站規模與流量,靈活組合上述策略,即可在不影響正常用戶體驗的前提下,將垃圾留言降至最低。