引言

4 年多前 Yii 推出了 2.0 测试版,正好赶上年底,工作不忙,于是我抱着学习的态度写了一个开源论坛,那就是 GetYii。虽然后来没怎么维护了,但是还是会每天去逛逛。

最近发现有人在 GetYii 上发垃圾内容,灰产广告。这就不能忍了,这篇文章我就分享一下我是如何与他们『斗争』的。

方案

为了防止垃圾评论我实施了以下方案,方案按照时间先后顺序排名。

删帖冻结用户账号

因为 GetYii 注册没有做邮箱验证,注册门槛非常低,这也给 Spammer 提供了便利。我也懒得再加上注册验证邮箱的步骤了。于是我就采用了采用了删帖同时冻结用户账号的操作,这个是最简单的方案了,但也是最累的方案了。而且不能根治。Spammer 能做到大量发放垃圾广告估计也是写了脚本。很快我也放弃了这种方案。

发帖验证码 && 设置新注册用户一定时长才可以发帖

Yii2 自带验证码功能,而且开发一个『设置新注册用户一定时长才可以发帖』功能也很快,这比开发『注册验证邮箱』实现起来快的多。但是这种方案非常的简单粗暴,很不友好,虽然现在 GetYii 发帖人少了,但是我也不愿意牺牲这种体验,很快我也放弃了这种方案。

开发识别 Spam 的扩展

反 span,用的最多的方案应该是贝叶斯垃圾邮件过滤,网上也有一些基于反垃圾内容的 SAAS 系统,前者对于我这个小网站,有点杀鸡用牛刀,后者因为要收费,对于小网站也没必要。

于是我就自己写了一个简单的反垃圾程序 - yiier/yii2-anti-spam,思路很简单,特点在于支持两种类型匹配:

  • 类型一:简单的模糊匹配。写一个敏感词库,模糊匹配内容是否包含在内。比如要匹配『军车』,敏感词写入『军{2}车』,那么类似『军XX车』的字符都能被匹配到。
  • 类型一:相似度匹配。类似 PHP 的 similar_text,是否好用待考察。

目前 GetYii 就是用的这种方案,把『发帖验证码 && 设置新注册用户一定时长才可以发帖』方案去掉了,前期遇到垃圾内容先加敏感词库,再删内容,虽然刚开始辛苦点,但是有明显效果。

限制发帖频率

虽然上个方案已经有一点效果了,但是我又想到了可以限制发帖频率来限制 Spammer 发垃圾内容刷屏现象,因为正常用户是不会频繁发帖的,比方说现在 GetYii 就限制了发帖间隔为 1 个小时。

后期还可以检测到频繁发帖的用户进行屏蔽 IP 的方案。

总结

想不到对于 GetYii 这么小流量的网站也会被 Spammer 盯上,但是如果想做个社区,此功能是必不可少的一部分。此外还有用户可以屏蔽其他用户功能。

参考链接