<commit_before>---
layout: post
title: "GetYii 是如何防止垃圾内容"
date: 2019-07-30 22:58:22 +0800
comments: true
categories: 经验分享
---

## 引言

4 年多前 [Yii](https://www.yiiframework.com/) 推出了 2.0 测试版，正好赶上年底，工作不忙，于是我抱着学习的态度写了一个开源论坛，那就是 [GetYii](https://github.com/iiyii/getyii)。虽然后来没怎么维护了，但是还是会每天去逛逛。

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

<!--more-->

## 方案

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

### 删帖冻结用户账号

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

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

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

### 开发识别 Spam 的扩展

反 span，用的最多的方案应该是[贝叶斯垃圾邮件过滤](https://zh.wikipedia.org/wiki/%E8%B2%9D%E8%91%89%E6%96%AF%E5%9E%83%E5%9C%BE%E9%83%B5%E4%BB%B6%E9%81%8E%E6%BF%BE)，网上也有一些基于反垃圾内容的 SAAS 系统，前者对于我这个小网站，有点杀鸡用牛刀，后者因为要收费，对于小网站也没必要。

于是我就自己写了一个简单的反垃圾程序 -  [yiier/yii2-anti-spam](https://github.com/yiier/yii2-anti-spam)，思路很简单，写一个敏感词库，检查内容是否包含在内，特点在于支持两种类型匹配：

- 类型一：简单的模糊匹配。比如要匹配『军车』，敏感词写入『军{2}车』，那么类似『军XX车』的字符都能被匹配到。
- 类型一：相似度匹配。类似 PHP 的 [similar_text](https://php.net/manual/zh/function.similar-text.php)，是否好用待考察。

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

### 限制发帖频率

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

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

## 总结

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

## 参考链接

- [一个简单的评论过滤系统的实现](https://ruby-china.org/topics/23718)

<commit_msg>update: GetYii 是如何防止垃圾内容<commit_after>---
layout: post
title: "GetYii 是如何防止垃圾内容"
date: 2019-07-30 22:58:22 +0800
comments: true
categories: 经验分享
---

## 引言

4 年多前 [Yii](https://www.yiiframework.com/) 推出了 2.0 测试版，正好赶上年底，工作不忙，于是我抱着学习的态度写了一个开源论坛，那就是 [GetYii](https://github.com/iiyii/getyii)。虽然后来没怎么维护了，但是还是会每天去逛逛。

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

<!--more-->

## 方案

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

### 删帖冻结用户账号

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

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

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

### 开发识别 Spam 的扩展

反 span，用的最多的方案应该是[贝叶斯垃圾邮件过滤](https://zh.wikipedia.org/wiki/%E8%B2%9D%E8%91%89%E6%96%AF%E5%9E%83%E5%9C%BE%E9%83%B5%E4%BB%B6%E9%81%8E%E6%BF%BE)，网上也有一些基于反垃圾内容的 SAAS 系统，前者对于我这个小网站，有点杀鸡用牛刀，后者因为要收费，对于小网站也没必要。

于是我就自己写了一个简单的反垃圾程序 -  [yiier/yii2-anti-spam](https://github.com/yiier/yii2-anti-spam)，思路很简单，特点在于支持两种类型匹配：

- 类型一：简单的模糊匹配。写一个敏感词库，模糊匹配内容是否包含在内。比如要匹配『军车』，敏感词写入『军{2}车』，那么类似『军XX车』的字符都能被匹配到。
- 类型一：相似度匹配。类似 PHP 的 [similar_text](https://php.net/manual/zh/function.similar-text.php)，是否好用待考察。

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

### 限制发帖频率

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

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

## 总结

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

## 参考链接

- [一个简单的评论过滤系统的实现](https://ruby-china.org/topics/23718)


{'fraction_non_alphanumeric': 0.1455599633811413, 'fraction_numerical': 0.03600854440036619, 'mean_word_length': 8.286118980169972, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 12, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2765266', 'n_tokens_mistral': 2835, 'n_tokens_neox': 3158, 'n_words': 158}