WordPress 垃圾評論一直是超級多超級煩人的,如果沒有有效的攔截方案,網站就會瞬間被每天幾百條的垃圾評論淹沒。
因為是每個 WordPress 站點都無法避免的問題,大家各顯神通,做出的解決方案也挺多的,這裡總結一下每種方法的特點和利弊:
識別垃圾評論#
以 Akismet 插件為代表,根據評論內容或評論者的資訊判斷評論是否為垃圾評論,再決定是否攔截。開啟後能攔截掉幾乎所有垃圾評論,但這種方法最大的缺陷是誤判,本站之前一直在用 Akismet 插件,誤判的概率還是挺大的,即使經常去垃圾箱查看,偶爾一條的正常評論和一大堆垃圾評論一起混在垃圾箱也很容易被遺漏;其次會拖慢提交評論的速度,因為每條評論都要先被發到 Akismet 的國外伺服器做識別。
禁止非中文評論#
90% 以上的垃圾評論都來自國外,所以這種方法可以攔截掉 90% 以上的垃圾評論,但缺點是無法發送純表情和類似 “2333”、“Thanks” 這種正常評論了,而且中文的垃圾評論也無法攔截掉。
修改評論 post 地址#
這種方法雖然看起來有點自欺欺人,但效果出奇地好,因為絕大部分的垃圾評論都是智障一樣只知道通過 post 網站根目錄的 wp-comments-post.php 來提交垃圾評論的。稍微麻煩一點的是 WordPress 每次升級都要重新修改。
人工驗證插件#
比如拖動解鎖、拼圖、驗證碼,效果是不錯,但犧牲了使用者體驗,對小站來說沒必要。
設置 token#
本站現在換用了這種方法,原理是每次刷新頁面,後端都會返回一個不同的 token 放到頁面上任意位置,然後在合適的時機用 JavaScript 將 token 填充到一個隱藏的 input 裡面,提交評論時將隱藏 input 的值(正常情況是 token)一起提交,後端通過判斷該值是否合法來判斷評論是不是通過正常途徑提交的。雖然這種方法也是可以破解的,但破解難度明顯高了很多,更重要的是 token 算法和隱藏 input 的結構容易更改,每次簡單的小修改都可以讓破解失效。
使用也很簡單,將如下程式碼放到主題的 function.php 即可,程式碼如下:
$leonax_magic_lower = 328; // token 最小值,自己隨意修改
$leonax_magic_upper = 3450709; // token 最大值,自己隨意修改
function leonax_anti_spam_form($fields){
global $leonax_magic_lower, $leonax_magic_upper;
$leonax_magic = mt_rand($leonax_magic_lower, $leonax_magic_upper); // 放在頁面的token值,是一個隨機數,每次都不同
$fields['leonax_magic'] = <<<EOT
<input type="hidden" id="leonax-magic" name="leonax-magic" value="0"> // 隱藏的 input
<script>
$(function() {
$("#comment-content").on("keyup", function() { // js 檢測到觸發 keyup、click 或 touch 事件時填充 token
$("#leonax-magic").val("$leonax_magic");
});
$('body').on('click touch', function () {
$("#leonax-magic").val("$leonax_magic");
});
})
</script>
EOT;
return $fields;
}
add_filter('comment_form_default_fields', 'leonax_anti_spam_form');
function leonax_anit_spam_caught() {
wp_die('<strong>評論失敗</strong>: 垃圾評論什麼的去死吧!');
}
function leonax_anti_spam_check( $commentdata ) {
$comment_type = '';
if ( isset($commentdata['comment_type']) ) {
$comment_type = trim($commentdata['comment_type']);
}
if ( ($comment_type == 'pingback') || ($comment_type == 'trackback') ) {
return $commentdata;
}
$content = '';
if ( isset($commentdata['comment_content']) ) {
$content = trim($commentdata['comment_content']);
}
if (!strlen($content)) {
leonax_anit_spam_caught();
}
global $leonax_magic_lower, $leonax_magic_upper;
if ( isset($commentdata['user_ID']) && $commentdata['user_ID'] ) { // 登入使用者不做判斷
return $commentdata;
}
if ( !isset($_POST['leonax-magic']) ) {
leonax_anit_spam_caught();
}
$magic = intval($_POST['leonax-magic']);
if ($magic < $leonax_magic_lower || $magic > $leonax_magic_upper) { // token 值在上面設定的最大值和最小值之間才合法
leonax_anit_spam_caught();
}
return $commentdata;
}
add_filter( 'preprocess_comment' , 'leonax_anti_spam_check' );
以上程式碼來自 LEONA+ 和 JustYY.com。
目前只找到這幾種方法,歡迎補充。