Home > Technology, WordPress > 阻止直接 POST 过来的 Spam

阻止直接 POST 过来的 Spam

几天前收到很多 spam, 居然大部分来自同一个 IP. 我只好在数据库里用 SQL 语句删掉. 再去看访问日志. 发现这个 IP 几乎是直接向我的 wp-comments-post.php 这个文件 POST 数据. 也就是说它根本没有访问文章. 我很气愤.

现在想到的解决方案是用 SESSION 来阻止. 写成插件 ( Stop post spam ). 本地测试有效. 但要是用了 HTML 静态缓存就不知到了. 可能会导致任何人都无法提交? 不过总的来说这个是不适合完全静态页面的, 除非我们的隐藏域设置为固定的值? 这个有恐怕无法到达很好的阻止作用. 两难啊. 唉. 反正我也不用缓存插件. 不管了. 交给爱折腾的人吧.

再和大家说说我的流程是怎样的.

插件激活后通过 StopPOSTSpam 类的构造函数挂载方法到 WordPress 自身的 HOOKs 上. (怎么听上去有点拗口… (- -!))

用到的钩子: init, template_redirect, comment_form, pre_comment_on_post

具体实现流程:

正常访问状态, 访客访问可以评论的页面(比如普通的日志页面), PHP 执行如下:

  • init 会将ready状态设置为 true.
  • 到执行 template_redirect 的时候判断是否为评论的页面, 是则创建随机 SESSION 否则插件不再执行 Spam 判断
  • 评论表达中通过 comment_form 这个 hook 添加刚刚创建的 SESSION 隐藏域.
  • 提交评论的时候通过 pre_comment_on_post 这个 hook 判断 SESSION. 当然 ready 状态为 false 不判断.

直接POST数据时: 没有通过 template_redirect 这一步来生成 SESSION 当然是不能通过的. 它会被当成 spam 而阻止进一步向数据库提交.

最后祝大家元旦快乐, 我不想写感悟, 也不想总结. 反正这半年来过的真是不怎么样. 这算是2009最后一个小时的文章吧. 过几天的考试. 唉~ 我可能会死 ‘很惨’ . 有时间和爱心的朋友到时候可要过来安慰我啊…

下载这个插件.

Update:

在无法使用 session 的情况下改为判断来路. 不知是否试用于静态页面. 欢迎测试.

  1. yinheli Jan 12th, 2010 @ 11:17 | #26

    @badfish
    我很少关注 IE 了. IE 真是垃圾. 它不但很多地方不符合标准. js解析也很慢. 一般上网就用 chrome . 测试页面用 firefox

    改一下 js 文件. 我发到你邮箱吧.

  2. badfish Jan 12th, 2010 @ 11:18 | #27

    @yinheli
    ie是垃圾…但是没办法…现在用ie的人太多了 呵呵..谢谢了

  3. yinheli Jan 12th, 2010 @ 11:23 | #28

    @badfish
    很多玩 WP 的只是把自己的博客当实验田. 呵呵. 懒的去照顾那么多了. 有时候我很后悔发布了这个主题. 以为会有好评, 却招来非议. 甚至有人骂我的. 我都把那些评论屏蔽了.

  4. badfish Jan 12th, 2010 @ 11:26 | #29

    @yinheli
    是这样的,林子大了,什么鸟都会有的,不要在意别人说的,我觉得你这个主题很好啊,我正在往前端发展…所以下你的来学习下..非常感谢你的分享呢

  5. simaopig Jan 12th, 2010 @ 17:47 | #30

    咦,你这输入框又变右边来了啊?我用不用也调整着玩一会儿呢?犹豫中。。

  6. edikud Jan 12th, 2010 @ 20:16 | #31

    我没有用静态缓存,但任何人都无法提交了?

  7. edikud Jan 12th, 2010 @ 20:24 | #32

    http://heybronco.net/tech/wordpress/use-hidden-input-to-stop-spam/
    这个是参考NoSpamNX,采用随机数+MD5来产生。生成的数据保存在session里,这样一个访客只用生成一次,直到session过期,但我的session_start(); Warning: session_start() ….有什么方法在functions加上的??

  8. QiQiBoY Jan 12th, 2010 @ 20:30 | #33

    @KOK
    你用$(this).html(”);就可以加入html代码。。。。颜色自然就可以添加了。。。

    @yinheli
    另外,向你报告一个bug,我点击评论翻页之后,发现别人本该隐藏的需要审核的评论我居然能看到。。。。刷新页面则没有。。。点击翻页就会出现。。。。好神奇。。
    看张截图网页截图
    还有就是评论顺序会奇怪地穿越错位。。。。。

  9. yinheli Jan 12th, 2010 @ 21:26 | #34

    @simaopig
    我更新了

    @edikud
    试试在@session_start(); 即加个抑制错误符号.

    @KOK
    正如 QiQiBoY 说的.

    @QiQiBoY
    谢谢. 是我的疏忽. 已经修正了.

  10. bolo Feb 7th, 2010 @ 21:31 | #35

    不和Quick comment插件兼容

  11. Bronco Mar 29th, 2010 @ 16:24 | #36

    话说现在的spam robot会先访问一个post,获得cookie,然后再提交comment,这样REFERER验证和session验证全部失效了。哎~~看来只能依靠akismet了 :sad:

  12. simaopig Apr 16th, 2010 @ 14:24 | #37

    上次就忘问了,你的这个广告老版本也支持吗?我还是自己写的div呢。为此把IE6,IE7古老浏览器的提示都给停了。否则页面会飞掉。

    我CSS太菜了。。呼。

Submitting Comment, Give me a second...
Comment pages 1 2

Leave a comment

Allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">
Trackbacks & Pingbacks ( 0 )
  1. No trackbacks yet.