WP Anti Spam 小牆 1.8
小牆 1.7 就是因為不用 display:none, 改用 display:block;width:0;height:0;margin:0;padding:0; 所以留言框的左下角會出現個小點, 或是用 position:absolute;top:-500px, 其實各種方法都可以, 目的就是要隱藏小牆.
小牆 1.8 恢復用 display:none, 因為長久測試結果, 目前還沒有那麼聰明的 Spam, 那個擔心是多餘了.
另外, 小牆 1.8 優化了代碼, 執行更快.
將下列代碼 copy 到模板的 functions.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /* ----------------------------------------------- <<小牆>> Anti-Spam v1.8 by Willin Kan. */ //建立 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=$2w$3$4/textarea><textarea name=\"comment\" cols=\"100%\" rows=\"4\" style=\"display:none\"></textarea>",$input);') ); } } //檢查 function gate() { ( !empty($_POST['w']) && empty($_POST['comment']) ) ? $_POST['comment'] = $_POST['w'] : $_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']; } return $comment; } } $anti_spam = new anti_spam(); // -- END ---------------------------------------- |
另外, 為了節省資料庫空間, 也可將最後一個 $comment['comment_content']; 改為 substr($comment['comment_content'],0,50); 只截取50字.
"登入者不驗証" 功能 user_level 設為 0, 相關權限請參考 Roles_and_Capabilities.

为什么所有的ping back都会被当作是spam呢。。。
Trackbacks/Pingbacks 也是 spammer 常用的手法, 是用 wordpress 直接發出的.
現在也許較少了, 多的時候一天也有幾十篇.
一般博客反正 Trackbacks/Pingbacks 也不多, 手動修改內容, 審核通過就可以了.
今天遭遇超强spammer,小墙没拦住,一次45个spam,应该不是人工的吧,这垃圾评论的特点willin看看这篇文章:http://amangs.com/others/spammer-get-out.html
我也遇到了, 但 links 太多會自動列為 '待審', 我懷疑是從根目錄的 wp-comments-post.php 滲透進來的, 未經過評論送出, 所以小牆沒檢查.
娃哈哈,我今天也见到一个站一篇日志就是4500条spam
,不过没注意他的网址。估计那人对spam无奈了,连删都不想删了.
反正是 nofollow 屬性就可不理了, 只是版面難看而已.
哈哈,原来防spam的代码让大师写出来却是这么简单,怪不得叫小强,小而强大,受用了
是 "小牆", 簡體是 "小墻", 這回又多了 "小强", 呵呵~ 開心就好, 都一樣~
我用了这个Quick Comments插件,跟小墙冲突的,不能提交评论。
另外希望你能发布个AJAX COMMENTS不用嵌套的版本,很多主题并不是特别支持嵌套,其实很多时候只想“不刷新”就显示新评论而已。
這個嘛... 有空再寫吧, 我還在忙~
这个也是我希望的,希望Willin大师有机会了搞一个..
最近ak出问题了。。 现在也用上这个啦。。 挺不错的! 谢谢分享。。
你也是 WP 2.92 吧~ 好像都遇到問題了.
看來我把這段代碼加的有問題,今天倒是有一個spam,但沒有“小牆判斷這是Spam!”的提示
我正在你家, 那是人肉, 是我把它移到 spam.
看样子这个我的整上.
谢谢了哦.为此我还关闭了akismet
不客氣~ 希望使用沒問題.
今天也开始使用小强了,谢谢willin
不客氣~
我把代码加进去后出现Fatal error: Call to undefined function current_user_can() in /home/qf0105/domains/qinfei.info/public_html/wp-includes/functions.php on line 3646
为何?如何解决啊?
你的 WP 沒有 current_user_can() 的 function? 安裝不完全喔~ 少了文件.
原来是要加到主题里的文件中……我加错地方了,晕死!
另外再问下,我没修改你这个代码,要是拦截到垃圾评论是让我自己决定删不删吧?
上面寫了: "將下列代碼 copy 到模板的 functions.php"~
WP 源文件千萬不能改, 否則一升級就全沒了, 只能改的就是主題而已.
最後所有 spam 到垃圾去等你刪, 嫌麻煩可用方法一: 直接擋掉, 就當從來沒發生過.
今天听LLT说大师又更新了,过来复制代码来了。
本来还奇怪GReader怎么没提示呢,呵呵。
GR 好像對更新的內容不會提示.
又来反馈了,哈:最近一段时间,小墙不能拦截一些国外的spam,不知是不是人家spam升级了,有几个博友都遇到,我贴出一个spam内容给willin参考。
作者信息:Lisa30
quality-papers.com
Lisa30@unique-papers.com
194.44.168.197
评论内容:
Did you utilize support of a paper writing service for your good enough data? I opine that you really have good comparison contrast essay writing technique. Thanks a lot for your release!
(注:评论里面有多个链接)
我查查看~
我搜尋了 quality-papers.com 不少的 spam, 發現連模糊的圖形驗証碼都可過關, 還看到要注冊為會員才能留言的論壇也有~~ 不可思議. 機器人留言是不會判斷是否要注冊和填寫會員資料的, 可見 100% 是 '人肉 spam', 這就要用後台的 '黑名單' 來處理了~
这样啊,只好用黑名单了
多谢Willin Kan 大师无私奉献!
不客氣~ 有空常來~
暂时还不用这个。。。
发现跟Wordpress Thread Comment插件冲突了
会出现comment can not be empty
要如何改呢
在 wp-thread-comment.js.php 第 253, 255 行 增加 w 的判斷.
comment = stpm("comment",q); w = stpm("w",q); //丟進 w 欄內容
if(( comment == null || comment == "" )&&( w == null || w == "" )){
因小牆增了一欄 w, 所以也要檢查 w 欄不為空.
为何提示:comment can not be empty。求救
你可能用了其它有關 comment 的插件.
我也用了这段代码一个多月,挺好用的,还没有见过误判~~~
不过今天倒是出了个误判,而且还导致一个好友留言内容被清空了,只留下2个字母da,这是怎么回事呢???
而且归类到垃圾评论里,到了晚上才看到,而之前还清空过一次垃圾留言后才出现了,很是奇怪
分析這程式, 可發現這程式不會變更留言內容, 只會做標記. 如果留言被清掉部份内容, 那有可能用了不該用的符號, 是被 WP 過濾了. 如果被當垃圾評論, 可先看是不是小牆標記的, 小牆一定只抓機器留言. 還有, 數據庫有沒問題也會影響, 建議定期優化數據庫.
恩 好的 我检查下,谢谢解答
这段代码和《WordPress 內置嵌套評論專用 Ajax comments》一起用的时候,留言再编辑功能无效。
BTW,怎么COOKIE评论用户(记住我的用户名等资料)?
這兩個都是我寫的, 用很久了, 不會沖突啊~ 可能是其它原因.
cookie 在 comments-ajax.php 裏面寫好了, 如果沒作用, 可能是瀏覽器沒開 cookie.
原來是 "念青五筆輸入法" 的作者啊~ 久仰了~ 但你網站用 asp 不能用這個吧...
没有,我的blog.nianqing.net用的就是WP。参照发现我原来删除了"評論" id="comment",添加上后,加墙后的“再编辑”功能可以用了,但是刷新后发现再编辑等于是再回复,原有的内容还在,再编辑以一个新的回复出现。2.8.6的默认模板也是如此。
在 comments-ajax.php 查找
if ( $edit_id ){
wp_delete_comment( $edit_id ); //刪除被取代的評論
}
替換成:
if ( $edit_id ){
$comment['comment_ID'] = $edit_id;
$comment = $wpdb->escape($comment);
$commentdata = array_merge($comment, $commentdata);
$commentdata = wp_filter_comment( $commentdata );
extract(stripslashes_deep($commentdata), EXTR_SKIP);
$comment_content = apply_filters('comment_save_pre', $comment_content);
$data = compact('comment_content', 'comment_author', 'comment_author_email', 'comment_author_url');
$wpdb->update($wpdb->comments, $data, compact('comment_ID')); //更新資料
$comment_id = $edit_id;
} else {
$comment_id = wp_new_comment( $commentdata );
}
先試試看行不行, 這是真的替代方式, 但代碼比較麻煩.
上段代码的替代不行,完全无法发表或回复,报“重复发表评论,您好像发表过类似的评论。”
sorry, copy 漏掉了:
$comment_parent = isset($_POST['comment_parent']) ? absint($_POST['comment_parent']) : 0;
$commentdata = compact('comment_post_ID', 'comment_author', 'comment_author_email', 'comment_author_url', 'comment_content', 'comment_type', 'comment_parent', 'user_ID');
加在 if 的前面.
我還是把原檔寄給你試, 我發現還要改其它地方, 這是很久以前的測試檔, 有些細節在這裏說不清.
有些Bug……嗯……
出現什麼 bug 能否讓我知道?
我暂时停了,因为出现误判,误判的内容都是“[(”,而且全部trackbacks给墙了,内容为空,和误判一样无法恢复。
我這邊也收了很多留言, 如:"换友情链接么?记得回访哦!", "博主的文采不错,大家有空多交流!", "我也刚建了一个博客,有空大家多多交流呀!"...
看似誤判, 但想想... 他們如何填入隱藏欄?? 絕不是誤判, 相信我.
我重新拷贝代码再试试
我想到了~ 你忘了將 functions.php 存為 utf-8, 所以中文不顯示.
看到多人推荐 过来 look look
歡迎! 有 bug 要告訴我啊~
这个小墙和Quick Comments插件有冲突,使用这个插件时,提交评论会显示“请输入评论”的提示,但是不用这个插件的话,小墙就正常了
Quick Comments 應該也是找 name="comment", 這要改它的代碼了.
每天都受垃圾留言的困扰,今天试试你的“小强”
前几天 听万戈兄推荐这个小墙,不知道怎么的我始终打不开你的博客,今天总算打开了.
先收下了,留着备用。谢谢分享!
不客氣! 頭像很神秘~
头像是 福克斯面具,小墙真好用 再次感谢
再问个问题,那句小牆判斷這是Spam! 怎么把它去掉啊,因为有时也会误判,如果获准了就有这句话,我试着去了下就打不开网页了
不會誤判, 小牆建立一個隱藏欄, 會填寫隱藏欄的一定不是人. 如果留著它, 它還會繼續來... 以後就全是廣告了, 最好是刪了它. 如果要保留, 就刪掉那一行, 將狀態的垃圾改為已經核准就可以了. 至於會打不開網頁, 要檢查看看它是否隱藏了不良的 html 代碼.
是删这句知?"[ 小牆判斷這是Spam! ]\n"
哦~ 原來是要改源碼呀! } else { 和 $comment['comment_content'] = "[ 小牆判斷這是Spam! ]\n" .$comment['comment_content']; 這兩行可全刪.
但有留言還是將狀態的垃圾改為已經核准.
原来是这样啊,我只删了那个就不行了,我的博客正在搬家,搬好了那个留言回复功能应该就能发信了
我现在也是用的免费空间,门户通的,那个ak居然不能用了,用你这个了呵
ak 不能用?
這個小牆不外鏈, 是很快. 而且還沒漏抓過~
奇怪,我把这代码加进去后,ajax好像就不行了,老出错js错误,我放在functions.php的最上面,有没有影响?
要提醒你 PHP 代碼要放在<?php ... ?>之間, 至於在 functions.php 的什麼位置都沒關係.
如果是 js 錯誤多半是模板的 id 沒對上, 可按照說明檢查一下 id .
哈哈,我发现你的博客没有装一个插件哦!强!
還是有三個插件, 自己做不來就用現成的.
看了下代码,请问这个小墙的原理是不是这样的:
在模模中插入一个名为 w的textarea ,然后隐藏了原来那个名为comment的textarea ,由于垃圾留言发送的软件一般只知道向comment这个变量提交内容,这样就会导致w为空而comment有内容,由此可判断这不是人在提交数据,而是批量发垃圾留言的软件或机器。
不知我分析得有没有道理? 我博客也有一个方法与此类似,不过比这个麻烦一点:五分钟杜绝垃圾评论http://www.hacklog.cn/php/five-minutes-anti-spam.html (说明,这个方法也不是我原创的,是我根据网友的方法改进的-_-)
沒錯! 就是把 comment 的區域隱藏起來, 挖個坑讓 spam 跳.
测试了一下,发现和wp-thread-comments有冲突,表现为第一个评论时没问题,但第二个就会出现comments cannot be empty的错误。不知道是否我的个例,小墙1.6a一切正常。
在 wp-thread-comment.js.php 第 253, 255 行 增加 w 的判斷.
comment = stpm("comment",q); w = stpm("w",q); //丟進 w 欄內容
if(( comment == null || comment == "" )&&( w == null || w == "" )){
因小牆增了一欄 w, 所以也要檢查 w 欄不為空.
感谢willin大师,小墙堪称完美,另外在使用上还有个小问题,已经发去你的邮箱了
改進了登入者不驗証, 謝謝哈~