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.
 

87 篇回應 (訪客:42 篇, 博主:37 篇, 引用:8 篇)

  1. shog ~

    为什么所有的ping back都会被当作是spam呢。。。

    • willin ~

      Trackbacks/Pingbacks 也是 spammer 常用的手法, 是用 wordpress 直接發出的.
      現在也許較少了, 多的時候一天也有幾十篇.
      一般博客反正 Trackbacks/Pingbacks 也不多, 手動修改內容, 審核通過就可以了.

  2. 今天遭遇超强spammer,小墙没拦住,一次45个spam,应该不是人工的吧,这垃圾评论的特点willin看看这篇文章:http://amangs.com/others/spammer-get-out.html

  3. Cooved ~

    哈哈,原来防spam的代码让大师写出来却是这么简单,怪不得叫小强,小而强大,受用了 :lol:

  4. Skyoy ~

    我用了这个Quick Comments插件,跟小墙冲突的,不能提交评论。
    另外希望你能发布个AJAX COMMENTS不用嵌套的版本,很多主题并不是特别支持嵌套,其实很多时候只想“不刷新”就显示新评论而已。

  5. 超人 ~

    最近ak出问题了。。 现在也用上这个啦。。 挺不错的! 谢谢分享。。

  6. 看來我把這段代碼加的有問題,今天倒是有一個spam,但沒有“小牆判斷這是Spam!”的提示

  7. ~

    看样子这个我的整上. :lol: 谢谢了哦.为此我还关闭了akismet

  8. AnQ ~

    今天也开始使用小强了,谢谢willin

  9. 我把代码加进去后出现Fatal error: Call to undefined function current_user_can() in /home/qf0105/domains/qinfei.info/public_html/wp-includes/functions.php on line 3646
    为何?如何解决啊?

    • willin ~

      你的 WP 沒有 current_user_can() 的 function? 安裝不完全喔~ 少了文件.

      • 原来是要加到主题里的文件中……我加错地方了,晕死!
        另外再问下,我没修改你这个代码,要是拦截到垃圾评论是让我自己决定删不删吧?

        • willin ~

          上面寫了: "將下列代碼 copy 到模板的 functions.php"~
          WP 源文件千萬不能改, 否則一升級就全沒了, 只能改的就是主題而已.
          最後所有 spam 到垃圾去等你刪, 嫌麻煩可用方法一: 直接擋掉, 就當從來沒發生過.

  10. LAONB ~

    今天听LLT说大师又更新了,过来复制代码来了。
    本来还奇怪GReader怎么没提示呢,呵呵。

  11. 又来反馈了,哈:最近一段时间,小墙不能拦截一些国外的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!

    (注:评论里面有多个链接)

  12. 多谢Willin Kan 大师无私奉献!

  13. edikud ~

    暂时还不用这个。。。 :smile:

  14. 蝎子 ~

    发现跟Wordpress Thread Comment插件冲突了
    会出现comment can not be empty
    要如何改呢

    • willin ~

      在 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 欄不為空.

  15. 精灵 ~

    为何提示:comment can not be empty。求救

  16. derek ~

    我也用了这段代码一个多月,挺好用的,还没有见过误判~~~
    不过今天倒是出了个误判,而且还导致一个好友留言内容被清空了,只留下2个字母da,这是怎么回事呢???

    • derek ~

      而且归类到垃圾评论里,到了晚上才看到,而之前还清空过一次垃圾留言后才出现了,很是奇怪

      • willin ~

        分析這程式, 可發現這程式不會變更留言內容, 只會做標記. 如果留言被清掉部份内容, 那有可能用了不該用的符號, 是被 WP 過濾了. 如果被當垃圾評論, 可先看是不是小牆標記的, 小牆一定只抓機器留言. 還有, 數據庫有沒問題也會影響, 建議定期優化數據庫.

  17. 念青 ~

    这段代码和《WordPress 內置嵌套評論專用 Ajax comments》一起用的时候,留言再编辑功能无效。

    BTW,怎么COOKIE评论用户(记住我的用户名等资料)?

    • willin ~

      這兩個都是我寫的, 用很久了, 不會沖突啊~ 可能是其它原因.
      cookie 在 comments-ajax.php 裏面寫好了, 如果沒作用, 可能是瀏覽器沒開 cookie.

    • willin ~

      原來是 "念青五筆輸入法" 的作者啊~ 久仰了~ 但你網站用 asp 不能用這個吧...

      • 念青 ~

        没有,我的blog.nianqing.net用的就是WP。参照发现我原来删除了"評論" id="comment",添加上后,加墙后的“再编辑”功能可以用了,但是刷新后发现再编辑等于是再回复,原有的内容还在,再编辑以一个新的回复出现。2.8.6的默认模板也是如此。

        • willin ~

          在 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 );
          }
          先試試看行不行, 這是真的替代方式, 但代碼比較麻煩.

          • 念青 ~

            上段代码的替代不行,完全无法发表或回复,报“重复发表评论,您好像发表过类似的评论。”

            • willin ~

              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 的前面.

            • willin ~

              我還是把原檔寄給你試, 我發現還要改其它地方, 這是很久以前的測試檔, 有些細節在這裏說不清.

  18. 有些Bug……嗯……

  19. 我暂时停了,因为出现误判,误判的内容都是“[(”,而且全部trackbacks给墙了,内容为空,和误判一样无法恢复。

  20. 看到多人推荐 过来 look look

  21. gil ~

    这个小墙和Quick Comments插件有冲突,使用这个插件时,提交评论会显示“请输入评论”的提示,但是不用这个插件的话,小墙就正常了

  22. gil ~

    每天都受垃圾留言的困扰,今天试试你的“小强” :razz:

  23. 前几天 听万戈兄推荐这个小墙,不知道怎么的我始终打不开你的博客,今天总算打开了.
    先收下了,留着备用。谢谢分享!

  24. shamas ~

    再问个问题,那句小牆判斷這是Spam! 怎么把它去掉啊,因为有时也会误判,如果获准了就有这句话,我试着去了下就打不开网页了

    • willin ~

      不會誤判, 小牆建立一個隱藏欄, 會填寫隱藏欄的一定不是人. 如果留著它, 它還會繼續來... 以後就全是廣告了, 最好是刪了它. 如果要保留, 就刪掉那一行, 將狀態的垃圾改為已經核准就可以了. 至於會打不開網頁, 要檢查看看它是否隱藏了不良的 html 代碼.

  25. shamas ~

    我现在也是用的免费空间,门户通的,那个ak居然不能用了,用你这个了呵

  26. 哈哈,我发现你的博客没有装一个插件哦!强!

  27. 看了下代码,请问这个小墙的原理是不是这样的:
    在模模中插入一个名为 w的textarea ,然后隐藏了原来那个名为comment的textarea ,由于垃圾留言发送的软件一般只知道向comment这个变量提交内容,这样就会导致w为空而comment有内容,由此可判断这不是人在提交数据,而是批量发垃圾留言的软件或机器。
    不知我分析得有没有道理? 我博客也有一个方法与此类似,不过比这个麻烦一点:五分钟杜绝垃圾评论http://www.hacklog.cn/php/five-minutes-anti-spam.html (说明,这个方法也不是我原创的,是我根据网友的方法改进的-_-)

  28. 测试了一下,发现和wp-thread-comments有冲突,表现为第一个评论时没问题,但第二个就会出现comments cannot be empty的错误。不知道是否我的个例,小墙1.6a一切正常。

    • willin ~

      在 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 欄不為空.

  29. 万戈 ~

    感谢willin大师,小墙堪称完美,另外在使用上还有个小问题,已经发去你的邮箱了

留下評論

:?: :razz: :sad: :!: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: :smile: :evil:
貼圖 表情 ( ps. 若要貼代碼, 請將 "<" 改成 "&lt;" 即可, 此方法在所有 WP 網站均適用. )

Trackbacks/Pingbacks

  1. 折腾之干掉插件之funtion版 – 静夜燃香 --- 2010年 07月 29日
  2. 新主题Green living上线测试. | 阿邙’S Blog --- 2010年 06月 15日
  3. Mr.差不多—It's My Life » WP Anti Spam 小墙 1.8 --- 2010年 05月 29日
  4. wordpress防止Spam之小墙1.8 | 超人流水账 --- 2010年 04月 09日
  5. 让spam下地狱吧! | 秦家大院 --- 2010年 04月 02日
  6. 小墙上马,世界清静了 - ACTIC WOLF --- 2009年 11月 03日
  7. 又发现一个防垃圾留言的东东:WP Anti Spam 小墙1.7 | Hacklog --- 2009年 09月 22日
  8. 防 Spam 新招——小墙升级 » Life Studio --- 2009年 07月 03日

這篇文章上的評論 RSS feed TrackBack URL