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. welee Dec 31st, 2009 @ 23:50 | #1

    我今天也收到200多个spam,晕死!
    祝你新年快乐哈!

  2. QiQiBoY Dec 31st, 2009 @ 23:56 | #2

    沙发吗。。? :smile: 。。。
    我的头像透明,后面的loading背景图片就露出来了。。。在页面加载后去掉为好

  3. 王小斯 Jan 2nd, 2010 @ 02:33 | #3

    大学的考试好说~
    和导师和任课教师搞好关系,没人难为你~
    实必不行, 晚上突击一下也成~

    B.Y. 直接把那IP禁了行了~ 不用那么费事~ :grin:

  4. 吖Bee Jan 2nd, 2010 @ 12:53 | #4

    哇!Philna2 V3啦!!~~~好兴奋啊~~~折腾有开始了~~哇呼!

    Happy New Year!

  5. grubylee Jan 2nd, 2010 @ 14:52 | #5

    额。再好好复习复习,主题都能写这么漂亮,考个试一定没问题的。加油。

  6. Xiaoding Jan 2nd, 2010 @ 19:41 | #6

    哦 今天这个功能很强大很实用,必须要赞一下!
    考研嘛 祝你成功! 我想是不会有什么问题的,还等着你考完了把这个主题完善下去呢。

  7. yinheli Jan 2nd, 2010 @ 22:16 | #7

    @welee
    200+ 也太离谱了. 删除看来也要用 SQL 不行.

    @QiQiBoY
    不知要怎么搞. 怎么就能判断你的头像下载完了呢? 不知道有什么完美的解决办法. 用 onload? 那是全部的内容加载完. jQuery的ready是 DOM加载完…. 唉就那样吧. 不是很多人的头像都透明. 嘿嘿 :mrgreen:

    @吖Bee
    哈, 用上了? 你倒是折腾的挺快.

    @Xiaoding
    最近的完善 == 删除一些功能. 有些已经有插件来做这样的事了. 有的是会影响到用缓存的朋友. 所以现在的主要原则是主题只做主题该做的事情.

  8. 吖Bee Jan 3rd, 2010 @ 17:38 | #8

    yinheli,为什么在loop.php加上声明(像你这种)框框会被拉伸?

  9. 吖Bee Jan 3rd, 2010 @ 18:27 | #9

    我是希望多出一点基础~修改Philna主题的东西…修改主题起来太吃力了..

  10. bolo Jan 3rd, 2010 @ 18:33 | #10

    似乎在后台关闭远程发布的选项就能减少很多spam了

  11. bolo Jan 3rd, 2010 @ 18:34 | #11

    @yinheli
    自己写一个头像调用函数就行了

  12. 吖Bee Jan 3rd, 2010 @ 18:38 | #12

    还有tidy这个功能~会引起RSS输出的错误,从 2.0.6版本就有这个问题,关闭了就没有事情。

  13. yinheli Jan 3rd, 2010 @ 22:23 | #13

    @吖Bee
    段落p是块级元素, 会填满整个盒子模型的. 修改这个主题的教程不知道从哪些方面着手. 要考虑大家的需求. 应该用这个主题的人不是很多吧. 你要是有问题可以发邮件给我.

    tidy 的功能是我考虑不周, 我现在用的服务器没有那个功能就一直不知道那个错误. 我会在下个版本修复.

    @bolo
    有这种事? 自我感觉吧. Spam 机器人应该不是根据那个来判断的.

  14. QiQiBoY Jan 5th, 2010 @ 00:07 | #14

    你可以用js给每个图片加上onload=”javascript:this.style.backgroundImage=’none’”;图片这个onload只是当前图片加载完就执行了。如果这段js在图片加载完前加入的话就会有效,以防万一还可以设定一个页面文档加载完成n秒内去除全部图片背景。。。我就是这么做的,效果还不错。你可以看一下我的友链页面前的favicon图标,就是这个。http://www.qiqiboy.com/links。

  15. 江流 Jan 5th, 2010 @ 22:34 | #15

    挺实用的,不过我喜欢post别人- -

  16. endergao Jan 6th, 2010 @ 01:06 | #16

    使用你的主题很不错
    不过有个小问题
    默认自带的边栏 如果我放别的东西进去 就会直接把默认的widget给覆盖掉
    能不能下一版做成widget单独列出来可以自己选的那种啊

  17. KOK Jan 10th, 2010 @ 03:10 | #17

    请问
    $(this).text(‘加载中…’);

    如何在这里加字体颜色?…

  18. 王盼盼 Jan 10th, 2010 @ 18:05 | #18

    博主您好,很喜欢你制作的主题。

  19. edikud Jan 11th, 2010 @ 11:49 | #19

    之前用你的主题不惜的,现在我的主题完成了,哈哈,有时间踩下啊!

  20. badfish Jan 12th, 2010 @ 08:29 | #20

    回复引用按钮均有点问题….

  21. yinheli Jan 12th, 2010 @ 10:29 | #21

    @badfish
    哪里有问题?

  22. badfish Jan 12th, 2010 @ 10:48 | #22

    按了回复
    @yinheli

    不出现在文本框中 反而出现在页面的顶部…

  23. yinheli Jan 12th, 2010 @ 10:50 | #23

    @badfish
    不知道你说的什么意思? 我这里用的很好啊.

  24. badfish Jan 12th, 2010 @ 10:52 | #24

    @welee
    不能截图 我说不清楚..火狐下正常 IE测试不正常..就是按了恢复那个图标后…”a href=”#comment-2759″>@welee </a"这句代码没出现在文本框中..直接出现在页面的顶部…

  25. badfish Jan 12th, 2010 @ 11:12 | #25

    @yinheli
    请问是什么原因…怎么修改? 我下了你的最新主题 也有这个错误“`

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.