feat(cool): 添加敏感词过滤功能

- 引入 go-sensitive-word 敏感词过滤库
- 在全局初始化中加载敏感词库并配置过滤器
- 在创建玩家时应用敏感词过滤,替换不合适的昵称内容
This commit is contained in:
2025-09-09 01:11:10 +08:00
parent 41b150e614
commit 685069fded
41 changed files with 88854 additions and 1 deletions

View File

@@ -3,11 +3,13 @@ package cool
import ( import (
"blazing/common/utils" "blazing/common/utils"
"context" "context"
"log"
"reflect" "reflect"
"github.com/gogf/gf/v2/os/glog" "github.com/gogf/gf/v2/os/glog"
"github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gconv"
"github.com/yitter/idgenerator-go/idgen" "github.com/yitter/idgenerator-go/idgen"
sensitive "github.com/zmexing/go-sensitive-word"
) )
var ctx = context.TODO() var ctx = context.TODO()
@@ -17,6 +19,7 @@ var (
Loger = glog.New() Loger = glog.New()
) )
var Filter *sensitive.Manager
func init() { func init() {
// 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId // 创建 IdGeneratorOptions 对象,可在构造函数中输入 WorkerId
@@ -33,5 +36,45 @@ func init() {
idgen.SetIdGenerator(options) idgen.SetIdGenerator(options)
newId := idgen.NextId() newId := idgen.NextId()
glog.Debug(context.Background(), "初始化雪花算法", newId) glog.Debug(context.Background(), "初始化雪花算法", newId)
Filter, err := sensitive.NewFilter(
sensitive.StoreOption{Type: sensitive.StoreMemory}, // 基于内存
sensitive.FilterOption{Type: sensitive.FilterDfa}, // 基于DFA算法
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = Filter.LoadDictEmbed(
sensitive.DictCovid19,
sensitive.DictOther,
sensitive.DictReactionary,
sensitive.DictViolence,
sensitive.DictPeopleLife,
sensitive.DictPornography,
sensitive.DictAdditional,
sensitive.DictCorruption,
sensitive.DictTemporaryTencent,
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
// 动态添加自定义敏感词
err = Filter.Store.AddWord("李世民", "秦始皇")
if err != nil {
log.Fatalf("添加敏感词发生了错误, err:%v", err)
return
}
// 动态自定义敏感词白名单
err = Filter.Store.DelWord("武汉海鲜市场", "武汉")
if err != nil {
log.Fatalf("删除敏感词发生了错误, err:%v", err)
return
}
} }

View File

@@ -0,0 +1,28 @@
# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go
name: Go
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Build
run: go build -v ./...
# - name: Test
# run: go test -v ./...

View File

@@ -0,0 +1,22 @@
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
vendor/
# Edit Dir
.idea
.project
.DS_Store
.vscode
.fleet

View File

@@ -0,0 +1,179 @@
# go-sensitive-word
敏感词敏感词/违禁词/违法词/脏词检测工具基于 DFA 算法实现的高性能 Go 敏感词过滤工具框架
## 快速接入
**安装**
```bash
go get -u github.com/zmexing/go-sensitive-word@latest
```
**使用**
```go
package main
import (
"fmt"
sensitive "github.com/zmexing/go-sensitive-word"
"log"
)
func main() {
filter, err := sensitive.NewFilter(
sensitive.StoreOption{Type: sensitive.StoreMemory}, // 基于内存
sensitive.FilterOption{Type: sensitive.FilterDfa}, // 基于DFA算法
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = filter.LoadDictEmbed(
sensitive.DictCovid19,
sensitive.DictOther,
sensitive.DictReactionary,
sensitive.DictViolence,
sensitive.DictPeopleLife,
sensitive.DictPornography,
sensitive.DictAdditional,
sensitive.DictCorruption,
sensitive.DictTemporaryTencent,
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
// 动态添加自定义敏感词
err = filter.Store.AddWord("李世民", "秦始皇")
if err != nil {
log.Fatalf("添加敏感词发生了错误, err:%v", err)
return
}
// 动态自定义敏感词白名单
err = filter.Store.DelWord("武汉海鲜市场", "武汉")
if err != nil {
log.Fatalf("删除敏感词发生了错误, err:%v", err)
return
}
sensitiveText := "李世民和老祖秦始皇的是忘年交,他们两个相约一起去武汉海鲜市场玩耍"
// 是否有敏感词
res1 := filter.IsSensitive(sensitiveText)
fmt.Printf("res1: %v \n", res1)
// 找到一个敏感词
res2 := filter.FindOne(sensitiveText)
fmt.Printf("res2: %v \n", res2)
// 找到所有敏感词
res3 := filter.FindAll(sensitiveText)
fmt.Printf("res3: %v \n", res3)
// 找到所有敏感词及出现次数
res4 := filter.FindAllCount(sensitiveText)
fmt.Printf("res4: %v \n", res4)
// 和谐敏感词
res5 := filter.Replace(sensitiveText, '*')
fmt.Printf("res5: %v \n", res5)
// 过滤铭感词
res6 := filter.Remove(sensitiveText)
fmt.Printf("res6: %v \n", res6)
}
// 输出结果
// res1: true
// res2: 李世民
// res3: [李世民 秦始皇]
// res4: map[李世民:1 秦始皇:1]
// res5: ***和老祖***的是忘年交,他们两个相约一起去武汉海鲜市场玩耍
// res6: 和老祖的是忘年交,他们两个相约一起去武汉海鲜市场玩耍
```
### 支持的功能API
| 方法名 | 说明 |
| ---------------- | -------------- |
| `IsSensitive()` | 判断文本中是否存在敏感词 |
| `FindOne()` | 查找文本中的第一个敏感词 |
| `FindAll()` | 查找文本中所有敏感词去重 |
| `FindAllCount()` | 查找所有敏感词及其出现次数 |
| `Replace()` | 替换所有敏感词为指定字符 |
| `Remove()` | 从文本中删除所有敏感词 |
| `AddWord()` | 动态添加敏感词 |
| `DelWord()` | 动态删除敏感词 |
## 更多特性
### 字符串检测
```go
// HasEmail 判断字符串中是否存在邮箱地址
func HasEmail(s string) bool
// MaskEmail 将字符串中存在的邮箱地址替换成 "*"
func MaskEmail(s string) string
// HasURL 判断字符串中是否存在网址
func HasURL(s string) bool
// MaskURL 将字符串中存在的网址替换成 "*"
func MaskURL(s string) string
// HasDigit 判断字符串中是否存在指定个数的数字(大于等于该数字)
func HasDigit(s string, count int) bool
// MaskDigit 将字符串中存在的数字替换成 "*"
func MaskDigit(s string) string
// HasWechatID 判断字符串中是否存在微信号
func HasWechatID(s string) bool
// MaskWechatID 将字符串中存在的微信号替换成 "*"
func MaskWechatID(s string) string
```
## 常见问题
- [Unicode相似字符攻击](./docs/unicode.md)
- [零宽字符攻击](docs/zero-width.md)
## 参考资料
- 基于Java DFA实现的敏感词过滤https://github.com/houbb/sensitive-word
- unicode字词的神奇组合https://www.zhihu.com/question/30873035
- unicode违规技巧https://zhuanlan.zhihu.com/p/545309061
- unicode视觉欺骗https://zhuanlan.zhihu.com/p/611904676
- unicode字符列表https://symbl.cc/en/unicode-table
- 汉字结构描述字符https://zh.wikipedia.org/wiki/%E8%A1%A8%E6%84%8F%E6%96%87%E5%AD%97%E6%8F%8F%E8%BF%B0%E5%AD%97%E7%AC%A6
- 敏感词库https://github.com/konsheng/Sensitive-lexicon
## 声明
本项目包含了一些敏感词库其设计目的是为了解决在互联网环境中可能出现的不适当内容通过技术手段屏蔽这些敏感词旨在构建一个更健康更安全的网络空间
请注意以下几点
1. **项目目的**
- 本项目的初衷是为开发者提供一个工具帮助他们在各类互联网产品中过滤和屏蔽不适当或敏感的内容从而营造一个良好的网络生态环境
2. **使用限制**
- 本项目中的敏感词库仅供技术研究和实现内容过滤功能之用
- 任何个人或组织不得将本项目中的敏感词库用于传播分享或其他任何可能导致敏感信息扩散的行为
3. **责任声明**
- 使用本项目所产生的任何直接或间接后果均由使用者自行承担本项目开发者不对因不当使用造成的任何损失或法律后果负责
4. **使用规范**
- 请确保在使用本项目时遵守相关法律法规
- 禁止将本项目用于任何违法或不正当的用途
通过下载和使用本项目即表示您同意并接受上述声明的所有内容希望本项目能够为您在构建净化网络空间的过程中提供帮助我们鼓励所有开发者共同努力营造一个健康安全的网络环境

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1,111 @@
# 性能压测
**硬件环境**
- 处理器Apple M2
- 基带内存16 GB 类型LPDDR5
- 系统类型MacOS Ventura 版本13.5 (22G74)
**压测结果**
| 方法 | Go耗时 | Java耗时 | 备注 |
|---|-------------------|--------------------|------------------|
| IsSensitive | 267 ns 452W QPS | 2724 ns 200W QPS | 大约是Java性能的 10 |
| Replace | 587 ns 202W QPS | 2865 ns 200W QPS | 大约是Java性能的 4.8 |
## 压测代码
**Go**
```go
func BenchmarkReplace(b *testing.B) {
filter := NewFilter(
StoreOption{Type: StoreMemory},
FilterOption{Type: FilterDfa},
)
err := filter.Store.LoadDictPath("./text/dict2.txt")
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
err = filter.Store.AddWord("测试1", "测试2")
if err != nil {
fmt.Println(err)
return
}
sensitiveText := "小明微笑着对毒品销售说,我认为台湾国的人有点意思"
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = filter.Replace(sensitiveText, '*')
}
}
```
**Java**
```java
package com.github.houbb.sensitive.word.benchmark;
import com.github.houbb.heaven.util.util.RandomUtil;
import com.github.houbb.sensitive.word.bs.SensitiveWordBs;
import com.github.houbb.sensitive.word.core.SensitiveWordHelper;
import org.junit.Ignore;
import org.junit.Test;
@Ignore
public class BenchmarkTimesTest {
@Test
public void onlyContainsTest() {
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
.enableWordCheck(true)
.enableNumCheck(false)
.enableUrlCheck(false)
.enableEmailCheck(false)
.ignoreRepeat(false)
.ignoreCase(false)
.ignoreNumStyle(false)
.ignoreChineseStyle(false)
.ignoreEnglishStyle(false)
.ignoreWidth(false)
.init();
String randomText = "小明微笑着对毒品销售说,我认为台湾国的人有点意思";
long start = System.nanoTime();
for(int i = 0; i < 2000000; i++) {
sensitiveWordBs.contains(randomText);
}
long end = System.nanoTime();
System.out.println("------------------ COST: " + (end-start)/2000000);
}
@Test
public void onlyReplaceTest() {
SensitiveWordBs sensitiveWordBs = SensitiveWordBs.newInstance()
.enableWordCheck(true)
.enableNumCheck(false)
.enableUrlCheck(false)
.enableEmailCheck(false)
.ignoreRepeat(false)
.ignoreCase(false)
.ignoreNumStyle(false)
.ignoreChineseStyle(false)
.ignoreEnglishStyle(false)
.ignoreWidth(false)
.init();
String randomText = "小明微笑着对毒品销售说,我认为台湾国的人有点意思";
long start = System.nanoTime();
for(int i = 0; i < 2000000; i++) {
sensitiveWordBs.replace(randomText);
}
long end = System.nanoTime();
System.out.println("------------------ COST: " + (end-start)/2000000);
}
}
```

View File

@@ -0,0 +1,151 @@
# DFA 算法实现敏感词过滤基于 Trie 的实现
敏感词过滤是许多应用中必不可少的功能用于防止敏感或不当内容的出现本文档介绍基于 Trie前缀树的敏感词过滤实现借鉴 DFA 思想包括构建流程匹配逻辑示意图实现细节与注意点文档贴合已有 Go 语言代码实现包含行为细节边界说明以及与 Aho-Corasick 算法的比较便于开发者正确使用和扩展
## 基本思想
- Trie/DFA 思想的多模式匹配将敏感词逐字符插入到树中 rune 为边匹配时从文本的每个起点开始沿树向下扫描检测是否存在敏感词
- Aho-Corasick 的区别
- Aho-Corasick Trie 的基础上增加 **failure **实现整体文本的线性扫描复杂度 O(n + totalPatternLength)
- 本实现采用 **逐起点尝试匹配** 的方式最坏情况下复杂度可能达到 O(n × m)n 为文本长度m 为敏感词最大长度
- 优点逻辑直观实现简单插入与查询容易理解
- 适用场景中小规模敏感词过滤大规模场景建议优化为 Aho-Corasick
## 组成部分
- 敏感词库存储Store保存所有敏感词可从文件数据库或远程接口加载提供添加删除功能
- DFA 模型Filter Trie 结构存储敏感词并完成匹配与处理每个节点用 `children map[rune]*dfaNode` 表示子节点 `isLeaf` bool 标记词尾
## 数据结构
```go
type dfaNode struct {
children map[rune]*dfaNode
isLeaf bool
}
type DfaModel struct {
root *dfaNode
}
```
- children map[rune]*dfaNode以字符为边存储当前节点的所有子节点
- isLeaf bool标记从 root 到当前节点的路径是否构成一个完整敏感词
- root空前缀状态所有匹配从这里开始
注意相同字符在不同父路径下会对应不同 dfaNode 实例路径唯一决定节点不会全局复用
## 构建过程AddWord / AddWords
- **初始化**创建根节点 `root`非叶子
- **插入流程**
1. 将敏感词转换为 []rune支持多字节字符如中文emoji
2. root 出发
- 若当前字符已存在子节点沿该节点前进
- 否则新建子节点并连接
3. 遍历结束后将最后节点标记为 isLeaf = true
- **批量添加**对多个词重复该过程共享前缀的词会复用节点
- **时间与空间复杂度**
- 时间O(L)L 为词长
- 空间新增节点数约等于新增字符数共享前缀可节省空间总空间与所有词字符总数相关
## 节点树示意图
### 简单示例
敏感词"敏感词""敏锐""铭记"
```mermaid
graph TD
Root((root))
Root --> 敏["敏"]
Root --> 铭["铭"]
敏 --> 感["感"]
感 --> 词["词 (isLeaf)"]
敏 --> 锐["锐 (isLeaf)"]
铭 --> 记["记 (isLeaf)"]
```
说明每条路径 root -> ... -> (isLeaf) 表示一个敏感词相同字符在不同路径下对应不同节点实例
### 复杂示例
敏感词"台海国""台海独立""台海总统""台海帝国""台界帝国"
```mermaid
graph TD
Root((root))
Root --> 台["台"]
台 --> 海["海"]
海 --> 海国["国 (isLeaf)"]
海 --> 海独["独"]
海独 --> 海独立["立 (isLeaf)"]
海 --> 海总["总"]
海总 --> 海总统["统 (isLeaf)"]
海 --> 海帝["帝"]
海帝 --> 海帝国["国 (isLeaf)"]
台 --> 界["界"]
界 --> 界帝["帝"]
界帝 --> 界帝国["国 (isLeaf)"]
```
要点`` 虽然是同一字符但在 Trie 中依赖父节点而存在多个不同节点实例并非全局唯一
## 匹配逻辑
**总体思路**按文本中的每个起点 start 向下沿 Trie 尝试匹配若在某位置遇到 isLeaf 则记录匹配若在某字符处无法继续匹配则把起点向右滑动一个位置重试 start++从文本的第一个字符开始根据字符在 Trie 中的转移逐步遍历整个文本如果当前字符找不到对应的转移则回到根节点重新开始匹配下一个字符如果匹配到叶子节点则表示找到了一个敏感词记录下该敏感词并继续匹配当匹配完成整个文本后返回所有匹配到的敏感词列表
### 核心变量
- runes输入文本转为 []rune
- start当前起点索引
- pos当前扫描位置
- parentTrie 中当前节点起点时为 root
- now当前字符对应的子节点
### 搜索伪代码 FindAll 为例
```go
start := 0
parent := root
for pos := 0; pos < length; pos++ {
now, found = parent.children[runes[pos]]
if !found {
// 当前路径没有继续,重置为新的起点
parent = root
pos = start // 重置 pos 为 start注意后续循环会再自动 pos++
start++
continue
}
// 找到子节点
if now.isLeaf && start <= pos {
// 在 [start, pos] 区间上匹配到一个完整敏感词
record match runes[start: pos + 1]
}
if pos == length - 1 {
// 到达文本末尾,重置以便从下一个起点开始
parent = root
pos = start
start++
continue
}
// 继续沿 Trie 向下匹配
parent = now
}
```
控制流要点未找到匹配时parent 重置为 root并将 pos = start, start++下一轮循环 pos++ 正好移动到下一个起点整体效果对每个起点尽可能延长匹配失败则向后滑动一位
### 匹配复杂度
- 本实现最坏时间复杂度O(n × m)n 文本长度m 敏感词最大长度
- 若需要严格线性时间可扩展为 Aho-Corasick failure-link
## 示例FindAll 执行过程
敏感词"敏锐", "敏感词", "铭记"
文本"我们要铭记敏锐的观察和敏感词出现"
- "铭" 开始匹配到 "铭记"
- 继续扫描匹配到 "敏锐"
- 再次匹配到 "敏感词"
- 返回结果"铭记", "敏锐", "敏感词"顺序可能随实现而异
## 复杂度分析
- 构建AddWord
- 时间O(L)
- 空间与总词长相关共享前缀节省空间
- 匹配FindAll
- 最坏O(n × m)
- Aho-CorasickO(n + totalPatternLength)
## 总结
- 本实现基于 Trie DFA 思想逻辑清晰易于理解和实现
- 缺点匹配效率在大规模词库时不如 Aho-Corasick
- 扩展建议添加 failure 链以优化性能支持更多字符类型和动态词库更新

View File

@@ -0,0 +1,164 @@
# Unicode相似字符攻击
## 攻击原理
Unicode 相似字符攻击是一种利用 Unicode 字符集中存在的字符相似性来绕过文本过滤或识别系统的攻击手段攻击者通过使用看似相同但实际上具有不同 Unicode 编码的字符来欺骗系统以达到绕过过滤器或识别系统的目的这种攻击可以用于欺诈钓鱼恶意代码注入等各种恶意活动中
**原理**
1. **Unicode 字符集的复杂性**Unicode 字符集非常庞大包含了数千个字符其中很多字符在外观上看起来非常相似或者完全一样但实际上它们的 Unicode 编码是不同的这种复杂性使得攻击者可以利用这些相似字符来绕过文本过滤或识别系统的检测
2. **字符规范化的差异**Unicode 规范定义了多种字符规范化形式比如 NFCNFDNFKCNFKD 它们会对字符进行不同程度的归一化处理攻击者可以利用不同的字符规范化形式来生成看似相同但实际上具有不同 Unicode 编码的字符
**外形一致不同点位文字演示**
例如下面两个 [](https://symbl.cc/en/unicode-table/#cjk-compatibility-ideographs) 和 [“⾦”](https://symbl.cc/en/unicode-table/#cjk-radicals-supplement) 字的比较,虽然肉眼看起来外形一致,但是再 unicode 中确是不同的点位。
![](assets/unicode-word1.png)
![](assets/unicode-word2.png)
```go
package main
import (
"fmt"
"unicode/utf8"
)
func main() {
s := "金"
r, _ := utf8.DecodeRuneInString(s)
fmt.Printf("Unicode 十六进制格式码点编码:%U\n", r)
s2 := "⾦"
r2, _ := utf8.DecodeRuneInString(s2)
fmt.Printf("s2 Unicode 十六进制格式码点编码:%U\n", r2)
}
// 输出内容
// Unicode 十六进制格式码点编码U+F90A
// s2 Unicode 十六进制格式码点编码U+2FA6
```
**UTF-8中文字符Unicode码点范围**
Unicode CJK 的范围分布在多个区段中带有 CJK 的区块名中都拥有汉字但最常用的范围是 `U+4E00U+9FA5`即名为CJK Unified Ideographs 的区块 U+9FA6U+9FFF 之间的字符还属于空码暂时还未定义但不能保证以后不会被定义
包括来自中文日文韩文越南文壮文琉球文中的汉字还包括越南的喃字与儒字方块壮字未来还包括甲骨文金文简帛文陶文鸟虫书等
- 注1中文范围 4E00-9FBFCJK 统一表意符号 (CJK Unified Ideographs)
- 注2正则表达式[\u4e00-\u9fa5] 可匹配中文字符但这种方式并不能根据平台所提供的字符集范围不同而改变
- 注3Unicode U+4E00U+9FFF 的码表http://www.unicode.org/charts/PDF/U4E00.pdf
**汉字Unicode编码范围**
对于不属于 `U+4E00U+9FA5` 范围的字符则是需要我们防止unicode相似字符攻击思考的地方
| **字符集中文名** | **字数** | **Unicode 编码** |
|-------------------------------------------------------------------------| -------- | ---------------- |
| [基本汉字](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=jbhz) | 20902字 | 4E00-9FA5 |
| [基本汉字补充](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=jbhzbc) | 90字 | 9FA6-9FFF |
| [扩展A](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kza) | 6592字 | 3400-4DBF |
| [扩展B](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzb) | 42720字 | 20000-2A6DF |
| [扩展C](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzc) | 4154字 | 2A700-2B739 |
| [扩展D](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzd) | 222字 | 2B740-2B81D |
| [扩展E](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kze) | 5762字 | 2B820-2CEA1 |
| [扩展F](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzf) | 7473字 | 2CEB0-2EBE0 |
| [扩展G](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzg) | 4939字 | 30000-3134A |
| [扩展H](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzh) | 4192字 | 31350-323AF |
| [扩展I](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kzi) | 622字 | 2EBF0-2EE5D |
| [康熙部首](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=kxbs) | 214字 | 2F00-2FD5 |
| [部首扩展](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=bskz) | 115字① | 2E80-2EF3 |
| [兼容汉字](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=jrhz) | 472字② | F900-FAD9 |
| [兼容扩展](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=jrkz) | 542字 | 2F800-2FA1D |
| [汉字笔画](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=hzbh) | 36字 | 31C0-31E3 |
| [汉字结构](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=hzjg) | 16字 | 2FF0-2FFF |
| [汉语注音](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=hyzy) | 43字 | 3105-312F |
| [注音扩展](https://www.qqxiuzi.cn/zh/hanzi-unicode-bianma.php?zfj=zykz) | 32字 | 31A0-31BF |
| | 1 | 3007 |
Unicode 版本15.1
字数备注:
部首扩展2E9A 是空码位
兼容汉字FA6EFA6F 是空码位
此页面的字数按实际字数标示排除空码位编码范围则排除了首尾空码位另一个页面[世界文字大全](https://www.qqxiuzi.cn/zh/unicode-zifu.php)》的编码范围标注则与 Unicode 一致(包括空码位)。 另,原有 PUA 字符产生于上世纪九十年代,现已全部标准化拥有正式码位,故从表中删除。
**形成过程**
1. **拉丁字符和特殊符号的混合**攻击者可以将拉丁字符比如英文字母与一些看似相似的特殊符号比如希腊字母数学符号等混合在一起生成一个看起来和原始字符相似但实际上具有不同编码的字符例如使用希腊字母的小写 sigmaσ替代拉丁字母的小写 ss
2. **全角和半角字符的混合**攻击者可以利用全角字符全角空格全角标点等和半角字符英文字符标点符号等的外观相似性来混合使用生成绕过过滤器的字符例如使用全角字符的英文句号替代半角字符的英文句号.
3. **Unicode 组合字符的利用**Unicode 支持字符的组合表示攻击者可以利用组合字符来生成看似相同但实际上具有不同编码的字符例如使用拉丁字母和组合重音符号combining acute accent来生成特定语言的字符绕过过滤器检测
通过利用这些技巧攻击者可以成功地绕过文本过滤或识别系统的检测传播有害内容或实施其他恶意活动因此对于开发文本过滤或识别系统的人员来说需要认识到 Unicode 相似字符攻击的潜在风险并采取相应的防御措施来保护系统的安全
## 解决方案
防止 Unicode 相似字符攻击是敏感词检测中的一个重要问题因为攻击者可以利用这些字符来绕过过滤器传播有害内容或攻击目标以下是一些防范措施
1. **字符归一化Normalization**将输入的文本进行字符归一化处理将不同形式的 Unicode 字符统一成同一种形式从而减少相似字符的影响Unicode 规范定义了几种不同的归一化形式Normalization Forms比如 NFCNFDNFKCNFKD可以根据具体需求选择合适的归一化方式
2. **白名单验证**限制用户输入只能包含特定的字符集合而不是接受任意字符可以定义一个白名单只允许合法字符通过过滤器
3. **规则匹配**建立一套严格的规则来检测和匹配潜在的相似字符攻击这些规则可以基于字符的视觉相似性Unicode 编码的相似性等
4. **黑名单过滤**维护一个黑名单包含已知的相似字符及其对应的正常字符当检测到输入中包含黑名单中的字符时可以将其替换或过滤掉
5. **用户教育**向用户提供教育让他们意识到利用相似字符来规避过滤器是不道德的行为并鼓励他们使用正常的字符输入
6. **多种检测手段结合**使用多种不同的技术和方法结合起来提高检测的准确性和鲁棒性从而有效地防止相似字符攻击
综合使用以上策略可以在敏感词检测中有效地防止相似字符攻击然而需要注意的是安全性是一个持续的过程需要不断地更新和改进防御措施以适应不断变化的威胁和攻击手法
**NFKC和NFKD的区别**
NFKC NFKD Unicode 字符串的两种归一化形式它们之间的主要区别在于归一化的方式和处理范围
1. **NFKCNormalization Form KC**
- 这种形式是 Unicode 归一化的一种形式其中K表示兼容compatibility
- NFKC 形式会尽可能地将字符转换为兼容的形式以便更容易地比较和匹配字符串它执行的归一化操作包括将一些特殊字符转换为等效的普通字符比如把全角标点转换成半角标点把特殊的组合字符转换为对应的单一字符等等
- NFKC 形式会保留字符的兼容性因此在某些情况下可能会导致字符的损失或变化但通常会更适合用于搜索比较和匹配等操作
2. **NFKDNormalization Form KD**
- 这种形式也是 Unicode 归一化的一种形式其中K表示兼容compatibilityD表示分解decomposition
- NFKD 形式会将字符分解为其组成部分即将组合字符拆分为基字符和重音这种形式更进一步对于某些特殊字符会将其转换为更基本的形式
- NFKD 形式会尽量消除字符的兼容性即使在某些情况下会导致字符的丢失或变化这种形式适用于一些特定场景如文本标准化索引化等
总的来说NFKC NFKD 形式在处理 Unicode 字符串时NFKC 更注重于保留字符的兼容性和整体可读性 NFKD 则更注重于字符的分解和简化如果你需要进行搜索比较或匹配操作那么 NFKC 形式可能更适合而如果你需要进行文本标准化或分析等操作那么 NFKD 形式可能更为合适
## Go代码实现
**归一化处理**
```go
import (
"fmt"
"golang.org/x/text/unicode/norm"
)
func main() {
// 原始字符串
original := "㋅"
targetStr := "6月"
fmt.Println("原始字符串:", original)
fmt.Println("目标字符串:", targetStr)
// NFC 形式(由组合字符组成)
nfc := norm.NFC.String(original)
fmt.Println("NFC 形式:", nfc)
// NFD 形式(由基字符和重音分开)
nfd := norm.NFD.String(original)
fmt.Println("NFD 形式:", nfd)
// 【推荐】 NFKC 形式(合成后的形式,且兼容 ASCII
nfkc := norm.NFKC.String(original)
fmt.Println("NFKC 形式:", nfkc)
// NFKD 形式(分解后的形式,且兼容 ASCII
nfkd := norm.NFKD.String(original)
fmt.Println("NFKD 形式:", nfkd)
// 判断目标字符串
res0 := original == targetStr
fmt.Println("原始和目标字符串比较", res0)
res1 := nfkc == targetStr
fmt.Println("NFKC字符串比较", res1)
res2 := nfkd == targetStr
fmt.Println("NFKD字符串比较", res2)
}
```

View File

@@ -0,0 +1,56 @@
# 零宽字符攻击
在Go语言中防止零宽字符攻击可以通过一些方法来实现零宽字符攻击通常是通过在字符串中插入隐藏的零宽字符来欺骗系统例如在认证字符串中插入零宽空格来绕过验证等以下是一些防止零宽字符攻击的方法
- 验证输入字符串在接受用户输入的地方进行输入验证确保字符串中不包含任何不必要的或可疑的字符可以使用正则表达式或简单的字符检查来过滤或拒绝包含零宽字符的字符串
- 规范化字符串在处理输入字符串之前可以使用Unicode规范化函数将字符串标准化为特定形式以移除任何不必要的或隐藏的字符
- 使用字节处理而不是字符串在某些情况下将字符串视为字节序列可能更安全通过将字符串转换为字节切片并以字节为单位进行处理可以避免字符串中的隐藏字符问题
```go
// IsZeroWidth 是否存在零宽字符
func IsZeroWidth(s string) bool {
re := regexp.MustCompile(`[\p{Cf}\\u200B]`)
return re.MatchString(s)
}
// RemoveZeroWidth 移除零宽字符
func RemoveZeroWidth(s string) string {
re := regexp.MustCompile(`[\p{Cf}\\u200B]`)
return re.ReplaceAllString(s, "")
}
```
```go
import (
"fmt"
"testing"
)
const (
str1 = "马斯克"
str2Zero = "马​‌‍斯​‌‍克​‌‍"
str3Zero = "马\\u200B斯\\u200B克"
)
func TestIsZeroWidth(t *testing.T) {
res1 := IsZeroWidth(str1)
fmt.Println("res1 结果:", res1) // false
res2 := IsZeroWidth(str2Zero)
fmt.Println("res2 结果:", res2) // true
res3 := IsZeroWidth(str3Zero)
fmt.Println("res3 结果:", res3) // true
}
func TestRemoveIsZeroWidth(t *testing.T) {
res1 := RemoveZeroWidth(str1)
fmt.Println("res1 结果:", res1) // 马斯克
res2 := RemoveZeroWidth(str3Zero)
fmt.Println("res2 结果:", res2) // 马斯克
res3 := res1 == res2
fmt.Println("res1 和 res2 比较的结果:", res3)
}
```

View File

@@ -0,0 +1,84 @@
package main
import (
"fmt"
"log"
sensitive "github.com/zmexing/go-sensitive-word"
)
func main() {
filter, err := sensitive.NewFilter(
sensitive.StoreOption{Type: sensitive.StoreMemory}, // 基于内存
sensitive.FilterOption{Type: sensitive.FilterDfa}, // 基于DFA算法
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = filter.LoadDictEmbed(
sensitive.DictCovid19,
sensitive.DictGFWAdditional,
sensitive.DictOther,
sensitive.DictReactionary,
sensitive.DictAdvertisement,
sensitive.DictPolitical,
sensitive.DictViolence,
sensitive.DictPeopleLife,
sensitive.DictGunExplosion,
sensitive.DictNeteaseFE,
sensitive.DictSexual,
sensitive.DictPornography,
sensitive.DictAdditional,
sensitive.DictCorruption,
sensitive.DictTemporaryTencent,
sensitive.DictIllegalURL,
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
// 动态添加自定义敏感词
err = filter.Store.AddWord("李世民", "秦始皇")
if err != nil {
log.Fatalf("添加敏感词发生了错误, err:%v", err)
return
}
// 动态自定义敏感词白名单
err = filter.Store.DelWord("武汉海鲜市场", "武汉")
if err != nil {
log.Fatalf("删除敏感词发生了错误, err:%v", err)
return
}
sensitiveText := "李世民和老祖秦始皇的是忘年交,他们两个相约一起去武汉海鲜市场玩耍"
// 是否有敏感词
res1 := filter.IsSensitive(sensitiveText)
fmt.Printf("res1: %v \n", res1)
// 找到一个敏感词
res2 := filter.FindOne(sensitiveText)
fmt.Printf("res2: %v \n", res2)
// 找到所有敏感词
res3 := filter.FindAll(sensitiveText)
fmt.Printf("res3: %v \n", res3)
// 找到所有敏感词及出现次数
res4 := filter.FindAllCount(sensitiveText)
fmt.Printf("res4: %v \n", res4)
// 和谐敏感词
res5 := filter.Replace(sensitiveText, '*')
fmt.Printf("res5: %v \n", res5)
// 过滤铭感词
res6 := filter.Remove(sensitiveText)
fmt.Printf("res6: %v \n", res6)
}

View File

@@ -0,0 +1,293 @@
package filter
// DFA 树节点结构
type dfaNode struct {
children map[rune]*dfaNode // 子节点
isLeaf bool // 是否为词尾
}
// DfaModel 是基于 DFA 的敏感词匹配器
func newDfaNode() *dfaNode {
return &dfaNode{
children: make(map[rune]*dfaNode),
isLeaf: false,
}
}
type DfaModel struct {
root *dfaNode
}
func NewDfaModel() *DfaModel {
return &DfaModel{
root: newDfaNode(),
}
}
// 添加多个词
func (m *DfaModel) AddWords(words ...string) {
for _, word := range words {
m.AddWord(word)
}
}
// 添加单个词到 DFA 树中
func (m *DfaModel) AddWord(word string) {
now := m.root
runes := []rune(word)
for _, r := range runes {
if next, ok := now.children[r]; ok {
now = next
} else {
next = newDfaNode()
now.children[r] = next
now = next
}
}
now.isLeaf = true
}
// 删除多个词
func (m *DfaModel) DelWords(words ...string) {
for _, word := range words {
m.DelWord(word)
}
}
// 删除单个词(仅支持叶子节点剪枝)
func (m *DfaModel) DelWord(word string) {
var lastLeaf *dfaNode
var lastLeafNextRune rune
now := m.root
runes := []rune(word)
for _, r := range runes {
if next, ok := now.children[r]; !ok {
return
} else {
if now.isLeaf {
lastLeaf = now
lastLeafNextRune = r
}
now = next
}
}
// 确保找到的词确实是叶子节点
if !now.isLeaf {
return
}
if lastLeaf != nil {
// 没有其他分支,删除从 lastLeaf 到目标节点的路径
delete(lastLeaf.children, lastLeafNextRune)
} else {
// 有其他分支,只取消叶子标记
now.isLeaf = false
}
}
// 监听新增和删除通道
func (m *DfaModel) Listen(addChan, delChan <-chan string) {
go func() {
for word := range addChan {
m.AddWord(word)
}
}()
go func() {
for word := range delChan {
m.DelWord(word)
}
}()
}
// 查找文本中所有敏感词
func (m *DfaModel) FindAll(text string) []string {
var matches []string // stores words that match in dict
var found bool // if current rune in node's map
var now *dfaNode // current node
start := 0
parent := m.root
runes := []rune(text)
length := len(runes)
for pos := 0; pos < length; pos++ {
now, found = parent.children[runes[pos]]
if !found {
parent = m.root
pos = start
start++
continue
}
if now.isLeaf && start <= pos {
matches = append(matches, string(runes[start:pos+1]))
}
if pos == length-1 {
parent = m.root
pos = start
start++
continue
}
parent = now
}
var res []string
set := make(map[string]struct{})
for _, word := range matches {
if _, ok := set[word]; !ok {
set[word] = struct{}{}
res = append(res, word)
}
}
return res
}
// 查找所有敏感词及其出现次数
func (m *DfaModel) FindAllCount(text string) map[string]int {
res := make(map[string]int)
var found bool
var now *dfaNode
start := 0
parent := m.root
runes := []rune(text)
length := len(runes)
for pos := 0; pos < length; pos++ {
now, found = parent.children[runes[pos]]
if !found {
parent = m.root
pos = start
start++
continue
}
if now.isLeaf && start <= pos {
res[string(runes[start:pos+1])]++
}
if pos == length-1 {
parent = m.root
pos = start
start++
continue
}
parent = now
}
return res
}
// 查找一个敏感词(命中第一个即返回)
func (m *DfaModel) FindOne(text string) string {
var found bool
var now *dfaNode
start := 0
parent := m.root
runes := []rune(text)
length := len(runes)
for pos := 0; pos < length; pos++ {
now, found = parent.children[runes[pos]]
if !found || (!now.isLeaf && pos == length-1) {
parent = m.root
pos = start
start++
continue
}
if now.isLeaf && start <= pos {
return string(runes[start : pos+1])
}
parent = now
}
return ""
}
// 判断文本中是否包含敏感词
func (m *DfaModel) IsSensitive(text string) bool {
return m.FindOne(text) != ""
}
// 将敏感词替换为指定字符(如 *
func (m *DfaModel) Replace(text string, repl rune) string {
var found bool
var now *dfaNode
start := 0
parent := m.root
runes := []rune(text)
length := len(runes)
for pos := 0; pos < length; pos++ {
now, found = parent.children[runes[pos]]
if !found || (!now.isLeaf && pos == length-1) {
parent = m.root
pos = start
start++
continue
}
if now.isLeaf && start <= pos {
for i := start; i <= pos; i++ {
runes[i] = repl
}
}
parent = now
}
return string(runes)
}
// 将敏感词从文本中完全移除
func (m *DfaModel) Remove(text string) string {
var found bool
var now *dfaNode
start := 0 // 从文本的第几个文字开始匹配
parent := m.root
runes := []rune(text)
length := len(runes)
filtered := make([]rune, 0, length)
for pos := 0; pos < length; pos++ {
now, found = parent.children[runes[pos]]
if !found || (!now.isLeaf && pos == length-1) {
filtered = append(filtered, runes[start])
parent = m.root
pos = start
start++
continue
}
if now.isLeaf {
start = pos + 1
parent = m.root
} else {
parent = now
}
}
filtered = append(filtered, runes[start:]...)
return string(filtered)
}

View File

@@ -0,0 +1,21 @@
package filter
type (
Filter interface {
// FindAll 找到所有敏感词
FindAll(text string) []string
// FindAllCount 找到所有敏感词及出现次数
FindAllCount(text string) map[string]int
// FindOne 找到一个敏感词
FindOne(text string) string
// IsSensitive 是否有敏感词
IsSensitive(text string) bool
// Replace 和谐敏感词
Replace(text string, repl rune) string
// Remove 过滤铭感词
Remove(text string) string
}
)
// 接口实现验证
var _ Filter = (*DfaModel)(nil)

View File

@@ -0,0 +1,30 @@
module github.com/zmexing/go-sensitive-word
go 1.20
require (
github.com/imroc/req/v3 v3.43.3
github.com/orcaman/concurrent-map/v2 v2.0.1
)
require (
github.com/andybalholm/brotli v1.1.0 // indirect
github.com/cloudflare/circl v1.3.7 // indirect
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/klauspost/compress v1.17.7 // indirect
github.com/onsi/ginkgo/v2 v2.16.0 // indirect
github.com/quic-go/qpack v0.4.0 // indirect
github.com/quic-go/quic-go v0.41.0 // indirect
github.com/refraction-networking/utls v1.6.3 // indirect
go.uber.org/mock v0.4.0 // indirect
golang.org/x/crypto v0.21.0 // indirect
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect
golang.org/x/mod v0.16.0 // indirect
golang.org/x/net v0.22.0 // indirect
golang.org/x/sys v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/tools v0.19.0 // indirect
)

View File

@@ -0,0 +1,65 @@
github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M=
github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY=
github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU=
github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q=
github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/imroc/req/v3 v3.43.3 h1:WdZhpUev9THtuwEZsW2LOYacl12fm7IkB7OgACv40+k=
github.com/imroc/req/v3 v3.43.3/go.mod h1:SQIz5iYop16MJxbo8ib+4LnostGCok8NQf8ToyQc2xA=
github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg=
github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
github.com/onsi/ginkgo/v2 v2.16.0 h1:7q1w9frJDzninhXxjZd+Y/x54XNjG/UlRLIYPZafsPM=
github.com/onsi/ginkgo/v2 v2.16.0/go.mod h1:llBI3WDLL9Z6taip6f33H76YcWtJv+7R3HigUjbIBOs=
github.com/onsi/gomega v1.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8=
github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ=
github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c=
github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo=
github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A=
github.com/quic-go/quic-go v0.41.0 h1:aD8MmHfgqTURWNJy48IYFg2OnxwHT3JL7ahGs73lb4k=
github.com/quic-go/quic-go v0.41.0/go.mod h1:qCkNjqczPEvgsOnxZ0eCD14lv+B2LHlFAB++CNOh9hA=
github.com/refraction-networking/utls v1.6.3 h1:MFOfRN35sSx6K5AZNIoESsBuBxS2LCgRilRIdHb6fDc=
github.com/refraction-networking/utls v1.6.3/go.mod h1:yil9+7qSl+gBwJqztoQseO6Pr3h62pQoY1lXiNR/FPs=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ=
golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -0,0 +1,42 @@
package go_sensitive_word
import (
"errors"
"github.com/zmexing/go-sensitive-word/filter"
"github.com/zmexing/go-sensitive-word/store"
)
// Manager 是敏感词过滤系统的核心结构,整合了词库存储和过滤算法
type Manager struct {
store.Store // // 词库存储接口(支持内存、本地文件、远程等)
filter.Filter // // 敏感词匹配算法接口(如 DFA
}
// NewFilter 初始化过滤器和词库存储
// 参数storeOption 指定存储方式filterOption 指定过滤算法
func NewFilter(storeOption StoreOption, filterOption FilterOption) (*Manager, error) {
var filterStore store.Store
var myFilter filter.Filter
switch storeOption.Type {
case StoreMemory: // 使用内存词库
filterStore = store.NewMemoryModel()
default:
return nil, errors.New("invalid store type")
}
switch filterOption.Type {
case FilterDfa: // 使用 DFA 算法
dfaModel := filter.NewDfaModel()
// 启动监听协程,实时接收新增/删除词的通知
go dfaModel.Listen(filterStore.GetAddChan(), filterStore.GetDelChan())
myFilter = dfaModel
default:
return nil, errors.New("invalid filter type")
}
return &Manager{
Store: filterStore,
Filter: myFilter,
}, nil
}

View File

@@ -0,0 +1,155 @@
package go_sensitive_word
import (
"fmt"
"log"
"testing"
)
// 敏感词检测
func TestFilter(t *testing.T) {
filter, err := NewFilter(
StoreOption{Type: StoreMemory},
FilterOption{Type: FilterDfa},
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = filter.LoadDictEmbed(
DictCovid19,
DictOther,
DictReactionary,
DictViolence,
DictPeopleLife,
DictPornography,
DictAdditional,
DictCorruption,
DictTemporaryTencent,
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
// 动态自定义敏感词
err = filter.Store.AddWord("测试1", "测试2", "成小王")
if err != nil {
fmt.Println(err)
return
}
sensitiveText := "成小王微笑着对毒品销售说,我认为台湾国的人有点意思"
// 是否有敏感词
res1 := filter.IsSensitive(sensitiveText)
fmt.Printf("res1: %v \n", res1)
// 找到一个敏感词
res2 := filter.FindOne(sensitiveText)
fmt.Printf("res2: %v \n", res2)
// 找到所有敏感词
res3 := filter.FindAll(sensitiveText)
fmt.Printf("res3: %v \n", res3)
// 找到所有敏感词及出现次数
res4 := filter.FindAllCount(sensitiveText)
fmt.Printf("res4: %v \n", res4)
// 和谐敏感词
res5 := filter.Replace(sensitiveText, '*')
fmt.Printf("res5: %v \n", res5)
// 过滤铭感词
res6 := filter.Remove(sensitiveText)
fmt.Printf("res6: %v \n", res6)
}
// 压力测试
func BenchmarkIsSensitive(b *testing.B) {
filter, err := NewFilter(
StoreOption{Type: StoreMemory},
FilterOption{Type: FilterDfa},
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = filter.LoadDictEmbed(
DictCovid19,
DictOther,
DictReactionary,
DictViolence,
DictPeopleLife,
DictPornography,
DictAdditional,
DictCorruption,
DictTemporaryTencent,
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
err = filter.Store.AddWord("测试1", "测试2")
if err != nil {
fmt.Println(err)
return
}
sensitiveText := "小明微笑着对毒品销售说,我认为台湾国的人有点意思"
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = filter.IsSensitive(sensitiveText)
}
}
// 压力测试
func BenchmarkReplace(b *testing.B) {
filter, err := NewFilter(
StoreOption{Type: StoreMemory},
FilterOption{Type: FilterDfa},
)
if err != nil {
log.Fatalf("敏感词服务启动失败, err:%v", err)
return
}
// 加载敏感词库
err = filter.LoadDictEmbed(
DictCovid19,
DictOther,
DictReactionary,
DictViolence,
DictPeopleLife,
DictPornography,
DictAdditional,
DictCorruption,
DictTemporaryTencent,
)
if err != nil {
log.Fatalf("加载词库发生了错误, err:%v", err)
return
}
err = filter.Store.AddWord("测试1", "测试2")
if err != nil {
fmt.Println(err)
return
}
sensitiveText := "小明微笑着对毒品销售说,我认为台湾国的人有点意思"
b.ResetTimer()
for i := 0; i < b.N; i++ {
_ = filter.Replace(sensitiveText, '*')
}
}

View File

@@ -0,0 +1,69 @@
package go_sensitive_word
import _ "embed"
// StoreMemory 类型常量定义
// 当前仅支持内存存储StoreMemory后续可扩展为 Redis、文件存储等。
const (
StoreMemory = iota // 内存模式词库(默认)
)
// FilterDfa 类型常量定义
// 当前仅支持 DFA 算法FilterDfa后续可支持 Trie、AC自动机、正则等。
const (
FilterDfa = iota // DFA 敏感词过滤算法(默认)
)
// StoreOption 定义了词库存储的配置选项
// Type 字段用于指定词库的存储实现方式如内存、Redis、文件等。
type StoreOption struct {
Type uint32 // 存储类型标识,例如 StoreMemory
}
// FilterOption 定义了敏感词过滤器的配置选项
// Type 字段用于指定过滤算法的实现方式,如 DFA、Trie、正则等。
type FilterOption struct {
Type uint32 // 过滤器类型标识,例如 FilterDfa
}
// 内置敏感词词库(通过 go:embed 嵌入编译时)
// 这些变量可直接用于调用 LoadDictEmbed 加载内置词库内容,无需读取本地文件。
// 可按需选择加载不同类别的敏感词,例如政治类、暴恐类、色情类、贪腐类等。
//
// 使用示例:
//
// err := manager.LoadDictEmbed(DictCovid19, DictPornography)
var (
//go:embed text/COVID-19词库.txt
DictCovid19 string
//go:embed text/GFW补充词库.txt
DictGFWAdditional string
//go:embed text/其他词库.txt
DictOther string
//go:embed text/反动词库.txt
DictReactionary string
//go:embed text/广告类型.txt
DictAdvertisement string
//go:embed text/政治类型.txt
DictPolitical string
//go:embed text/暴恐词库.txt
DictViolence string
//go:embed text/民生词库.txt
DictPeopleLife string
//go:embed text/涉枪涉爆.txt
DictGunExplosion string
//go:embed text/网易前端过滤敏感词库.txt
DictNeteaseFE string
//go:embed text/色情类型.txt
DictSexual string
//go:embed text/色情词库.txt
DictPornography string
//go:embed text/补充词库.txt
DictAdditional string
//go:embed text/贪腐词库.txt
DictCorruption string
//go:embed text/零时-Tencent.txt
DictTemporaryTencent string
//go:embed text/非法网址.txt
DictIllegalURL string
)

View File

@@ -0,0 +1,165 @@
package store
import (
"bufio"
"errors"
"github.com/imroc/req/v3"
cmap "github.com/orcaman/concurrent-map/v2"
"io"
"net/http"
"os"
"strings"
)
// MemoryModel 使用并发 map 实现的内存词库
type MemoryModel struct {
store cmap.ConcurrentMap[string, struct{}]
addChan chan string
delChan chan string
}
// NewMemoryModel 创建新的内存模型
func NewMemoryModel() *MemoryModel {
return &MemoryModel{
store: cmap.New[struct{}](),
addChan: make(chan string),
delChan: make(chan string),
}
}
// 从本地路径加载词库文件
func (m *MemoryModel) LoadDictPath(paths ...string) error {
for _, path := range paths {
err := func(path string) error {
f, err := os.Open(path)
defer func(f *os.File) {
_ = f.Close()
}(f)
if err != nil {
return err
}
return m.LoadDict(f)
}(path)
if err != nil {
return err
}
}
return nil
}
// 加载嵌入式文本词库go:embed
func (m *MemoryModel) LoadDictEmbed(contents ...string) error {
for _, con := range contents {
reader := strings.NewReader(con)
if err := m.LoadDict(reader); err != nil {
return err
}
}
return nil
}
// 从远程 HTTP 地址加载词库
func (m *MemoryModel) LoadDictHttp(urls ...string) error {
for _, url := range urls {
err := func(url string) error {
httpRes, err := req.Get(url)
if err != nil {
return err
}
if httpRes == nil {
return errors.New("nil http response")
}
if httpRes.StatusCode != http.StatusOK {
return errors.New(httpRes.GetStatus())
}
defer func(Body io.ReadCloser) {
_ = Body.Close()
}(httpRes.Body)
return m.LoadDict(httpRes.Body)
}(url)
if err != nil {
return err
}
}
return nil
}
// 读取词库(按行解析)
func (m *MemoryModel) LoadDict(reader io.Reader) error {
buf := bufio.NewReader(reader)
for {
line, _, err := buf.ReadLine()
if err != nil {
if err != io.EOF {
return err
}
break
}
m.store.Set(string(line), struct{}{})
m.addChan <- string(line)
}
return nil
}
// 返回所有敏感词的读取通道(可用于初始化加载)
func (m *MemoryModel) ReadChan() <-chan string {
ch := make(chan string)
go func() {
for key := range m.store.Items() {
ch <- key
}
close(ch)
}()
return ch
}
// 获取所有敏感词(字符串数组)
func (m *MemoryModel) ReadString() []string {
res := make([]string, 0, m.store.Count())
for key := range m.store.Items() {
res = append(res, key)
}
return res
}
// 获取新增词通道
func (m *MemoryModel) GetAddChan() <-chan string {
return m.addChan
}
// 获取删除词通道
func (m *MemoryModel) GetDelChan() <-chan string {
return m.delChan
}
// 添加自定义敏感词
func (m *MemoryModel) AddWord(words ...string) error {
for _, word := range words {
m.store.Set(word, struct{}{})
m.addChan <- word
}
return nil
}
// 删除敏感词(敏感词加白名单)
func (m *MemoryModel) DelWord(words ...string) error {
for _, word := range words {
m.store.Remove(word)
m.delChan <- word
}
return nil
}

View File

@@ -0,0 +1,31 @@
package store
import "io"
type (
Store interface {
// LoadDictPath 从指定的本地路径加载词库文件(可传多个路径)
LoadDictPath(path ...string) error
// LoadDictEmbed (推荐)加载嵌入式词库内容(如 go:embed 提供的字符串)
LoadDictEmbed(contents ...string) error
// LoadDictHttp 从远程 URL 加载词库内容(支持多个 URL
LoadDictHttp(url ...string) error
// LoadDict 从 io.Reader 加载词库内容(按行读取)
LoadDict(reader io.Reader) error
// ReadChan 返回一个通道,逐个输出当前存储中的所有敏感词(可用于异步加载到过滤器)
ReadChan() <-chan string
// ReadString 以字符串数组形式返回当前所有敏感词
ReadString() []string
// GetAddChan 获取新增敏感词的事件通道(用于实时监听词库变更)
GetAddChan() <-chan string
// GetDelChan 获取删除敏感词的事件通道(用于实时监听词库变更)
GetDelChan() <-chan string
// AddWord 添加一个或多个敏感词
AddWord(words ...string) error
// DelWord 删除一个或多个敏感词
DelWord(words ...string) error
}
)
// 接口实现验证
var _ Store = (*MemoryModel)(nil)

View File

@@ -0,0 +1,76 @@
武汉不明肺炎
武汉海鲜市场
沙士变异
爆發sars疫情
武汉卫生委员会
p4病毒实验室
病毒感染
疫情事件
肺炎病人
武汉流行肺炎
非典性肺炎
习近平到武汉
某人亲自
雷神山
总书记
总书记
红十字会
疫情
肺炎
習近平
中央
疫情
政府
負面
疫情
習主席
凝聚力
疫情蔓延
武汉
李克强
肺炎
总理
北京
武漢
李克強
扒一扒武汉病毒所
所长的成功史
地方官+疫情+中央+隱瞞
舉行+批評中國+兩會期間+隱瞞
武漢+中共+危機+北京
共产党+肺炎+表现+统治
疫情+红会+4+政府+湖北
中国共产党+最大的威胁+这个时代
武漢+明明+病毒+人傳人
美国疾控中心+冠状病毒
菲律宾总统府感谢中国捐赠菲律宾
全面接管+10号疫情不好转+解放军
網上教學+大力+推進
封城+部隊
政府+做出+测序+病毒
为辅+西医+冠状病毒
省委书记+通报+专家组+病毒
断崖式下跌+疫情防控
發起罷工+五大訴求+員工陣線
香港+林鄭+呼籲+病毒
香港+港府+衞生防護+港人
大陸+台灣+病毒+外交部
口罩+台灣+出口+國家
口罩+台灣+政府+中國大陸
澳門+政府+戴口罩
武漢肺炎疫情失控
死亡病例+肺炎+死亡人數
武漢+感染+十幾萬
上海+背景+药物+病毒
毒城+武漢
武汉+发生+人传人+病毒
肺炎+疾病预防控制+病毒+医学期刊
有关+疾病控制+旅行限制+病毒
疫情+颜色革命+李文亮
聲音+人傳人+李文亮
疫情+病毒+李文亮+中央
冠状病毒+人传人+李文亮
监察委+确诊+李文亮
武漢+光復
湖北+五大诉求
武汉+五大诉求

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,158 @@
穴海
协警
纳米比亚
专业调查
有华龙
jq的来
电信路
党鞭
第一夫人
黄巨
荡尽天下
家元自称玉皇大帝
主席李世民
何祚庥
刘刚
不要沉默
后勤集团
食堂涨价
发国难财
浪漫邂逅
红满堂
张小洋
炸学校
子宫
叫晶晶的女孩
回派
社会黑暗
国之母
国母
国姆
东方微点
震惊全球
nowto
chengdu
徐明
六月飞雪
暴力虐待
暴力袭击
天府广场
粮荒
洗脑班
李愚蠢
中国猪
台湾猪
进化不完全的生命体
震死他们
10010
10086
10159
13423205670
13725516608
13875448369
15112886328
189
6-4tianwang
64
68170802
6a6.net
7.31
7.310
89-64cdjp
8945212
23
259o
381929279
3P
4-Jun
AV
BJ
CBD
CCTV
CDMA
DICK
Dick
FLG
FOCUSC
FUCK
Fuck
GAMEMASTER
GCD
GameMaster
IP17908
KEY_TEXT
NMD
QQb
SM
Soccer01.com
TMD
UltraSurf
bignews
Bitch
boxun
Chinaliberal
chinamz
Chinesenewsnet
cnd
Creaders
dafa
Dajiyuan
df'd
Dfdz
die
dpp
Freechina
freedom
Freenet
fuck
fuck your mother
hongzhi
hrichina
huanet
hypermart.net
incest
jiangdongriji
l2590803027
lihongzhi
ma
making
minghui
minghuinews
nacb
na?ve
nmis
paper64
peacehall
piao
playboy
renminbao
renmingbao
rfa
safeweb
sex
shit
simple
svdc
taip
tibetalk
triangle
triangleboy
txwq.net
unixbox
ustibet
voa
voachinese
wangce
wstaiji
www
xinsheng
yuming
yy通讯录
zhengjian
zhengjianwang
zhenshanren
zhuanfalu
zhuanfalun
八九
八老

View File

@@ -0,0 +1,557 @@
腐败中国
三个呆婊
你办事我放心
社会主义灭亡
打倒中国
打倒共产党
打倒共产主义
打倒胡锦涛
打倒江泽民
打倒江主席
打倒李鹏
打倒罗干
打倒温家宝
打倒中共
打倒朱镕
抵制共产党
抵制共产主义
抵制胡锦涛
抵制江泽民
抵制江主席
抵制李鹏
抵制罗干
抵制温家宝
抵制中共
抵制朱镕基
灭亡中国
亡党亡国
粉碎四人帮
激流中国
特供
特贡
特共
zf大楼
殃视
贪污腐败
强制拆除
形式主义
政治风波
太子党
上海帮
北京帮
清华帮
红色贵族
权贵集团
河蟹社会
喝血社会
九风
9
十七大
十7大
17da
九学
9
四风
4
双规
南街村
最淫官员
警匪
官匪
独夫民贼
官商勾结
城管暴力执法
强制捐款
毒豺
一党执政
一党专制
一党专政
专制政权
宪法法院
胡平
苏晓康
贺卫方
谭作人
焦国标
万润南
张志新
辛灝年
高勤荣
王炳章
高智晟
司马璐
刘晓竹
刘宾雁
魏京生
寻找林昭的灵魂
别梦成灰
谁是新中国
讨伐中宣部
异议人士
民运人士
启蒙派
选国家主席
民一主
min主
民竹
民珠
民猪
chinesedemocracy
大赦国际
国际特赦
da选
投公
公头
宪政
平反
党章
维权
昝爱宗
宪章
08
08xz
抿主
敏主
人拳
人木又
人quan
renquan
中国人权
中国新民党
群体事件
群体性事件
上中央
去中央
讨说法
请愿
请命
公开信
联名上书
万人大签名
万人骚动
截访
上访
shangfang
信访
访民
集合
集会
组织集体
静坐
静zuo
jing坐
示威
示wei
游行
you行
油行
游xing
youxing
官逼民反
反party
反共
抗议
亢议
抵制
低制
底制
di制
抵zhi
dizhi
boycott
血书
焚烧中国国旗
baoluan
流血冲突
出现暴动
发生暴动
引起暴动
baodong
灭共
杀毙
罢工
霸工
罢考
罢餐
霸餐
罢参
罢饭
罢吃
罢食
罢课
罢ke
霸课
ba课
罢教
罢学
罢运
网特
网评员
网络评论员
五毛党
五毛们
5毛党
戒严
jieyan
jie严
戒yan
8的平方事件
知道64
八九年
贰拾年
2o年
20和谐年
贰拾周年
六四
六河蟹四
六百度四
六和谐四
陆四
陆肆
198964
5月35
89年春夏之交
64惨案
64时期
64运动
4事件
四事件
北京风波
学潮
学chao
xuechao
学百度潮
门安天
天按门
坦克压大学生
民主女神
历史的伤口
高自联
北高联
血洗京城
四二六社论
王丹
柴玲
沈彤
封从德
王超华
王维林
吾尔开希
吾尔开西
侯德健
阎明复
方励之
蒋捷连
丁子霖
辛灏年
蒋彦永
严家其
陈一咨
中华局域网
党的喉舌
互联网审查
当局严密封锁
新闻封锁
封锁消息
爱国者同盟
关闭所有论坛
网络封锁
金盾工程
gfw
无界浏览
无界网络
自由门
何清涟
中国的陷阱
汪兆钧
记者无疆界
境外媒体
维基百科
纽约时报
bbc中文网
华盛顿邮报
世界日报
东森新闻网
东森电视
星岛日报
wikipedia
youtube
googleblogger
美国广播公司
英国金融时报
自由亚洲
自由时报
中国时报
反分裂
威胁论
左翼联盟
钓鱼岛
保钓组织
主权
弓单
火乍
木仓
石肖
核蛋
步qiang
bao炸
爆zha
baozha
zha药
zha弹
炸dan
炸yao
zhadan
zhayao
hmtd
三硝基甲苯
六氟化铀
炸药配方
弹药配方
炸弹配方
皮箱炸弹
火药配方
人体炸弹
人肉炸弹
解放军
兵力部署
军转
军事社
8341部队
第21集团军
七大军区
7大军区
北京军区
沈阳军区
济南军区
成都军区
广州军区
南京军区
兰州军区
颜色革命
规模冲突
塔利班
基地组织
恐怖分子
恐怖份子
三股势力
印尼屠华
印尼事件
蒋公纪念歌
马英九
mayingjiu
李天羽
苏贞昌
林文漪
陈水扁
陈s扁
陈随便
阿扁
a扁
告全国同胞书
台百度湾
台完
台wan
taiwan
台弯
湾台
台湾国
台湾共和国
台军
台独
台毒
台du
taidu
twdl
一中一台
打台湾
两岸战争
攻占台湾
支持台湾
进攻台湾
占领台湾
统一台湾
收复台湾
登陆台湾
解放台湾
解放tw
解决台湾
光复民国
台湾独立
台湾问题
台海问题
台海危机
台海统一
台海大战
台海战争
台海局势
入联
入耳关
中华联邦
国民党
x民党
民进党
青天白日
闹独立
duli
fenlie
日本万岁
小泽一郎
劣等民族
汉人
汉维
维汉
维吾
吾尔
热比娅
伊力哈木
疆独
东突厥斯坦解放组织
东突解放组织
蒙古分裂分子
列确
阿旺晋美
藏人
臧人
zang人
藏民
藏m
达赖
赖达
dalai
哒赖
dl喇嘛
丹增嘉措
打砸抢
西独
藏独
葬独
臧独
藏毒
藏du
zangdu
支持zd
藏暴乱
藏青会
雪山狮子旗
拉萨
啦萨
啦沙
啦撒
拉sa
lasa
la萨
西藏
藏西
藏春阁
藏獨
藏独
藏独立
藏妇会
藏青会
藏字石
xizang
xi藏
x藏
西z
tibet
希葬
希藏
硒藏
稀藏
西脏
西奘
西葬
西臧
援藏
bjork
王千源
安拉
回教
回族
回回
回民
穆斯林
穆罕穆德
穆罕默德
默罕默德
伊斯兰
圣战组织
清真
清zhen
qingzhen
真主
阿拉伯
高丽棒子
韩国狗
满洲第三帝国
满狗
鞑子
江丑闻
江嫡系
江毒
江独裁
江蛤蟆
江核心
江黑心
江胡内斗
江祸心
江家帮
江绵恒
江派和胡派
江派人马
江泉集团
江人马
江三条腿
江氏集团
江氏家族
江氏政治局
江氏政治委员
江梳头
江太上
江戏子
江系人
江系人马
江宰民
江贼
江贼民
江主席
麻果丸
麻将透
麻醉弹
麻醉狗
麻醉枪
麻醉槍
麻醉药
麻醉藥
台独
台湾版假币
台湾独立
台湾国
台湾应该独立
台湾有权独立
天灭中共
中共帮凶
中共保命
中共裁
中共党文化
中共腐败
中共的血旗
中共的罪恶
中共帝国
中共独裁
中共封锁
中共封网
中共腐败
中共黑
中共黑帮
中共解体
中共近期权力斗争
中共恐惧
中共权力斗争
中共任用
中共退党
中共洗脑
中共邪教
中共政治游戏
中共邪毒素

View File

@@ -0,0 +1,123 @@
兼职
招聘
网络
QQ
招聘
有意者
到货
本店
代购
扣扣
客服
微店
兼职
兼值
淘宝
小姐
妓女
包夜
3P
LY
JS
狼友
技师
推油
胸推
BT
毒龙
口爆
兼职
楼凤
足交
口暴
口交
全套
SM
桑拿
吞精
咪咪
婊子
乳方
操逼
全职
性伴侣
网购
网络工作
代理
专业代理
帮忙点一下
帮忙点下
请点击进入
详情请进入
私人侦探
私家侦探
针孔摄象
调查婚外情
信用卡提现
无抵押贷款
广告代理
原音铃声
借腹生子
找个妈妈
找个爸爸
代孕妈妈
代生孩子
代开发票
腾讯客服电话
销售热线
免费订购热线
低价出售
款到发货
回复可见
连锁加盟
加盟连锁
免费二级域名
免费使用
免费索取
蚁力神
婴儿汤
售肾
刻章办
买小车
套牌车
玛雅网
电脑传讯
视频来源
下载速度
高清在线
全集在线
在线播放
txt下载
六位qq
6位qq
位的qq
个qb
送qb
用刀横向切腹
完全自杀手册
四海帮
足球投注
地下钱庄
中国复兴党
阿波罗网
曾道人
六合彩
改卷内幕
替考试
隐形耳机
出售答案
考中答案
答an
da案
资金周转
救市
股市圈钱
崩盘
资金短缺
证监会
质押贷款
小额贷款
周小川
刘明康
尚福林
孔丹

View File

@@ -0,0 +1,326 @@
习近平
平近习
xjp
习太子
习明泽
老习
温家宝
温加宝
温x
温jia宝
温宝宝
温加饱
温加保
张培莉
温云松
温如春
温jb
胡温
胡x
胡jt
胡boss
胡总
胡王八
hujintao
胡jintao
胡j涛
胡惊涛
胡景涛
胡紧掏
湖紧掏
胡紧套
锦涛
hjt
胡派
胡主席
刘永清
胡海峰
胡海清
江泽民
民泽江
江胡
江哥
江主席
江书记
江浙闽
江沢民
江浙民
择民
则民
茳泽民
zemin
ze民
老江
老j
江core
江x
江派
江zm
jzm
江戏子
江蛤蟆
江某某
江贼
江猪
江氏集团
江绵恒
江绵康
王冶坪
江泽慧
邓小平
平小邓
xiao平
邓xp
邓晓平
邓朴方
邓榕
邓质方
毛泽东
猫泽东
猫则东
猫贼洞
毛zd
毛zx
z东
ze东
泽d
zedong
毛太祖
毛相
主席画像
改革历程
朱镕基
朱容基
朱镕鸡
朱容鸡
朱云来
李鹏
李peng
里鹏
李月月鸟
李小鹏
李小琳
华主席
华国
国锋
国峰
锋同志
白春礼
薄熙来
薄一波
蔡赴朝
蔡武
曹刚川
常万全
陈炳德
陈德铭
陈建国
陈良宇
陈绍基
陈同海
陈至立
戴秉国
丁一平
董建华
杜德印
杜世成
傅锐
郭伯雄
郭金龙
贺国强
胡春华
耀邦
华建敏
黄华华
黄丽满
黄兴国
回良玉
贾庆林
贾廷安
靖志远
李长春
李春城
李建国
李克强
李岚清
李沛瑶
李荣融
李瑞环
李铁映
李先念
李学举
李源潮
栗智
梁光烈
廖锡龙
林树森
林炎志
林左鸣
令计划
柳斌杰
刘奇葆
刘少奇
刘延东
刘云山
刘志军
龙新民
路甬祥
罗箭
吕祖善
马飚
马恺
孟建柱
欧广源
强卫
沈跃跃
宋平顺
粟戎生
苏树林
孙家正
铁凝
屠光绍
王东明
汪东兴
王鸿举
王沪宁
王乐泉
王洛林
王岐山
王胜俊
王太华
王学军
王兆国
王振华
吴邦国
吴定富
吴官正
无官正
吴胜利
吴仪
奚国华
习仲勋
徐才厚
许其亮
徐绍史
杨洁篪
叶剑英
由喜贵
于幼军
俞正声
袁纯清
曾培炎
曾庆红
曾宪梓
曾荫权
张德江
张定发
张高丽
张立昌
张荣坤
张志国
赵洪祝
紫阳
周生贤
周永康
朱海仑
中南海
大陆当局
中国当局
北京当局
共产党
党产共
共贪党
阿共
产党共
公产党
工产党
共c党
共x党
共铲
供产
共惨
供铲党
供铲谠
供铲裆
共残党
共残主义
共产主义的幽灵
拱铲
老共
中共
中珙
中gong
gc党
贡挡
gong党
g产
狗产蛋
共残裆
恶党
邪党
共产专制
共产王朝
裆中央
土共
土g
共狗
g匪
共匪
仇共
政府
症腐
政腐
政付
正府
政俯
政f
zhengfu
政zhi
挡中央
档中央
中央领导
中国zf
中央zf
国wu院
中华帝国
gong和
大陆官方
北京政权
江泽民
胡锦涛
温家宝
习近平
习仲勋
贺国强
贺子珍
周永康
李长春
李德生
王岐山
姚依林
回良玉
李源潮
李干成
戴秉国
黄镇
刘延东
刘瑞龙
俞正声
黄敬
薄熙
薄一波
周小川
周建南
温云松
徐明
江泽慧
江绵恒
江绵康
李小鹏
李鹏
李小琳
朱云来
朱容基
法轮功
李洪志
新疆骚乱

View File

@@ -0,0 +1,178 @@
福音会
中国教徒
统一教
观音法门
清海无上师
盘古
李洪志
志洪李
李宏志
轮功
法轮
轮法功
三去车仑
氵去车仑
发论工
法x功
法o功
法0功
法一轮一功
轮子功
车仑工力
法lun
fa轮
法lg
flg
fl功
falungong
大法弟子
大纪元
dajiyuan
明慧网
明慧周报
正见网
新唐人
伪火
退党
tuidang
退dang
超越红墙
自fen
真善忍
九评
9
9ping
九ping
jiuping
藏字石
集体自杀
自sha
zi杀
suicide
titor
逢8必灾
逢八必灾
逢9必乱
逢九必乱
朱瑟里诺
根达亚文明
诺查丹玛斯
人类灭亡进程表
按照马雅历法
推背图
推bei图
济世灵文
诸世纪
电狗
电话定位器
电话拦截器
电话窃听
电话监
电话交友
电话追杀系统
电击枪
电鸡
电警棒
枪出售
枪的制
枪货到
枪决女犯
枪模
枪手
枪销售
枪械制
枪子弹
售步枪
售纯度
售单管
售弹簧刀
售防身
售狗子
售虎头
售火药
售假币
售健卫
售军用
售猎枪
售氯胺
售麻醉
售枪支
售热武
售三棱
售手枪
售五四
售一元硬
售子弹
售左轮
亚砷
亚砷酸钾
亚砷酸钠
亚硒酸
亚硒酸二钠
亚硒酸镁
亚硒酸钠
亚硒酸氢钠
亚硝酸乙酯
亚硝酰乙氧
氧化二丁基锡
氧化汞
氧化铊
氧化亚铊
氧氯化磷
原装弹
原子弹方法
原子弹清单
安眠酮
代血浆
普萘洛尔
呋塞米
西布曲明
testosterone
胰岛素样生长因子
促红细胞生成素
地西泮
尼可刹米
甲睾酮
adrenaline
erythropoietin
地奈德
莫达非尼
氯噻嗪
苯巴比妥
促性腺激素
泼尼松
麻黄草
雄烯二醇
地塞米松
tamoxifen
strychnine
androst
新型毒品
杜冷丁
兴奋剂
mdma
海洛因
海luo因
heroin
diamorphine
diacetylmorphine
鸦片
阿芙蓉
咖啡因
cocain
三唑仑
美沙酮
麻古
k粉
凯他敏
ketamine
冰毒
苯丙胺
cannabis
大麻
爱他死
氯胺酮
benzodiazepines
甲基安非他明
吗啡
安非他命

View File

@@ -0,0 +1,571 @@
打人
打人
拆迁
拆迁
纠纷
纠纷
盗窃
盗窃
安眠酮
代药物毒品类血浆
普萘洛尔
呋塞米
西布曲明
testosterone
胰岛素样生长因子
促红细胞生成素
地西泮
尼可刹米
甲睾酮
adrenaline
erythropoietin
地奈德
莫达非尼
氯噻嗪
苯巴比妥
促性腺激素
泼尼松
麻黄草
雄烯二醇
地塞米松
tamoxifen
strychnine
androst
新型毒品
杜冷丁
兴奋剂
mdma
海洛因
海luo因
heroin
diamorphine
diacetylmorphine
鸦片
阿芙蓉
咖啡因
cocain
三唑仑
美沙酮
麻古
k粉
凯他敏
ketamine
冰毒
苯丙胺
cannabis
大麻
爱他死
氯胺酮
benzodiazepines
甲基安非他明
安非他命
吗啡
morphine
摇头丸
迷药
乖乖粉
narcotic
麻醉药
精神药品
专业代理
帮忙点一下
帮忙点下
请点击进入
详情请进入
私人侦探
私家侦探
针孔摄象
调查婚外情
信用卡提现
无抵押贷款
广告代理
原音铃声
借腹生子
找个妈妈
找个爸爸
代孕妈妈
代生孩子
代开发票
腾讯客服电话
销售热线
免费订购热线
低价出售
款到发货
回复可见
连锁加盟
加盟连锁
免费二级域名
免费使用
免费索取
蚁力神
婴儿汤
售肾
刻章办
买小车
套牌车
玛雅网
电脑传讯
视频来源
下载速度
高清在线
全集在线
在线播放
txt下载
六位qq
6位qq
位的qq
个qb
送qb
用刀横向切腹
完全自杀手册
四海帮
足球投注
地下钱庄
中国复兴党
阿波罗网
曾道人
六合彩
改卷内幕
替考试
隐形耳机
出售答案
考中答案
答an
da案
资金周转
救市
股市圈钱
崩盘
资金短缺
证监会
质押贷款
小额贷款
周小川
刘明康
尚福林
孔丹
汉芯造假
杨树宽
中印边界谈判结果
喂奶门
摸nai门
酒瓶门
脱裤门
75事件
乌鲁木齐
新疆骚乱
针刺
打针
食堂涨价
饭菜涨价
h1n1
瘟疫爆发
yangjia
y佳
yang佳
杨佳
杨j
袭警
杀警
武侯祠
川b26931
贺立旗
周正毅
px项目
骂四川
家l福
家le福
加了服
麦当劳被砸
豆腐渣
这不是天灾
龙小霞
震其国土
yuce
提前预测
地震预测
隐瞒地震
李四光预测
蟾蜍迁徙
地震来得更猛烈
八级地震毫无预报
踩踏事故
聂树斌
万里大造林
陈相贵
张丹红
尹方明
李树菲
王奉友
零八奥运艰
惨奥
奥晕
凹晕
懊运
懊孕
奥孕
奥你妈的运
反奥
628事件
weng安
wengan
翁安
瓮安事件
化工厂爆炸
讨回工资
代办发票
代办各
代办文
代办学
代办制
代辦
代表烦
代开发票
代開
代考
代理发票
代理票据
代您考
代讨债
代写毕
代写论文
代孕
代追债
考后付款
考机构
考考邓
考联盟
考前答案
考前付
考前密卷
考前预测
考试,答案
考试,作弊器
考试包过
考试保
考试答案
考试机构
考试联盟
考试枪
考试作弊
考试作弊器
考研考中
考中答案
透视功能
透视镜
透视扑
透视器
透视眼睛
透视眼镜
透视药
透视仪
打死经过
打死人
打砸办公
打砸抢
安眠酮
代血浆
普萘洛尔
呋塞米
西布曲明
testosterone
胰岛素样生长因子
促红细胞生成素
地西泮
尼可刹米
甲睾酮
adrenaline
erythropoietin
地奈德
莫达非尼
氯噻嗪
苯巴比妥
促性腺激素
泼尼松
麻黄草
雄烯二醇
地塞米松
tamoxifen
strychnine
androst
新型毒品
杜冷丁
兴奋剂
mdma
海洛因
海luo因
heroin
diamorphine
diacetylmorphine
鸦片
阿芙蓉
咖啡因
cocain
三唑仑
美沙酮
麻古
k粉
凯他敏
ketamine
冰毒
苯丙胺
cannabis
大麻
爱他死
氯胺酮
benzodiazepines
甲基安非他明
安非他命
吗啡
KC短信
KC嘉年华
短信广告
短信群发
短信群发器
小6灵通
短信商务广告
段录定
无界浏览
无界浏览器
无界
无网界
无网界浏览
无帮国
KC提示
KC网站
UP8新势力
白皮书
UP新势力
移民
易达网络卡
安魂网
罢工
罢课
纽崔莱七折
手机复制
手机铃声
网关
神通加持法
全1球通
如6意通
清仓
灵动卡
答案卫星接收机
高薪养廉
考后付款
佳静安定片
航空母舰
航空售票
号码百事通
考前发放
成本价
诚信通手机商城
高利贷
联4通
黑庄
黑手党
黑车
联通贵宾卡
联总
联总这声传单
联总之声传单
高息贷款
高干子弟
恭喜你的号码
恭喜您的号码
高干子女
各个银行全称
各种发票
高官
高官互调
高官子女
喝一送一
卡号
复制
监听王
传单
旦科
钓鱼岛
钓鱼台
当官靠后台
党校安插亲信
传九促三
客户端非法字符
刻章
大麻树脂
大麻油
大法
大法弟子
dpp大法
fa lun
falu
发抡
发抡功
洗脑
下法轮
发轮
发伦
发伦功
发仑
发沦
发纶
发论
发论功
发论公
发正念
发囵
发愣
发瞟
罚抡
罚伦
罚仑
罚沦
罚纶
罚囵
筏抡
筏轮
筏伦
筏仑
筏沦
筏纶
筏论
筏囵
伐抡
伐轮
伐伦
伐仑
伐沦
伐论
伐囵
乏抡
乏轮
乏伦
乏仑
乏沦
乏纶
乏论
乏囵
阀抡
阀伦
阀仑
阀沦
阀纶
阀论
阀囵
*
..
法L功
法lun功
法功
法会
法抡
法抡功
法轮
法轮大法
法轮佛法
法轮功
法伦
法仑
法沦
法纶
法论
法十轮十功
法西斯
法院
法正
法谪
法谪功
法輪
法囵
法愣
.輪功
珐抡
珐轮
珐伦
珐仑
珐沦
五不
五不争鸣论坛
五出三进
五套功法
邝锦文
垡抡
垡轮
垡伦
垡仑
垡沦
垡纶
垡论
垡囵
茳澤民
荭志
闳志
闵维方
氵去
氵去车仑工力
转法轮
砝抡
砝轮
砝伦
砝仑
砝沦
砝纶
真理教
真善美
真善忍
砝论
砝囵
泓志
屙民
珐纶
珐论
珐囵
falun
Falundafa
fa轮
Flg
弟子
地下教会
炼功
梦网洪志
轮大
抡功
轮功
伦功
摩门教
三水法轮
三唑仑
天皇
天怒
天葬
车臣
达赖
功法
讲法
基督
基督教
护法
回教
教徒
功友
大师
达赖喇嘛
虹志
鸿志
洪传
贯通两极法
光祖
洪吟
洪哲胜
洪志
宏法
观世音
宏志
弘志
古兰经
红志
车库
经文
车仑

View File

@@ -0,0 +1,437 @@
出售雷管
炸药
炸药
出售炸药
出售炸药 电话
制作火药配方
炸药出售
出售雷管炸药
火药配方
在家里做原子弹
硝酸甘油炸弹制作
TNT 炸弹的制作
硝铵炸药配方
硝酸甘油制作
炸弹配方
简易炸药
火药制作简易炸弹
炸弹制作
硝酸甘油
硝酸甘油炸弹制作方法
手把手教你做炸弹
恐怖分子傻瓜手册
氢弹手工制作方法
起爆器
自制燃烧弹
燃烧弹
弹药制造方法
液体炸药配方
炸药配方与制作
自制炸药配方
tnt炸药成分
炸药的制作
tnt炸药配方
各种炸药配方大全
炸药的成分
燃烧弹的制作方
黑火药的配方
黑火药的制作
黑火药比例
燃烧弹 制作
黑火药配方比例
黑火药的成分
原子弹配方
原子弹DIY教程
C4炸药
雷管出售
制作硝化甘油
DIY核弹
核弹制作方法
原子弹制作手册
简易原子弹教程
黑火药配方
自制炸药方法
教你怎么用土办法做武器
莫洛托夫鸡尾酒的配方
zz炸弹的制作方法
C4炸药的成分
炸药制造生产工艺
原子弹制造完全手册
红烧兔子大餐
汽车炸弹制作
人体炸弹制作流程
炸弹制作从入门
鸡尾酒炸弹制作
集束炸弹制作
硝酸铵的简便制取方法
莫洛托夫燃烧弹
塑胶炸弹
用火药混合塑料
高性能爆炸物质混合
原子弹 制作方法
手教你制作原子弹
轻型巡航导弹的制作
黑索金的制造过程
Zha药制造进程
购买自爆材料
可塑炸弹制作方法
C4塑胶炸药
水浴法制TNT
简易核弹头的制造
高爆炸药的基本配方
如何制硝化甘油
燃烧剂的简易制备
简易大威力炸弹
炸弹制作入门
硝酸甘油炸药制作
基本配方是硝酸甘
燃烧剂的简易制作
制作性能优良的燃烧弹
酸甘油炸药
简易导弹制作
核弹头的制造
可塑炸弹制作
炸药硝酸甘油制法
原子弹制作方法
火药的配方
手教你做原子弹
怎么用土办法做武器
手把手教你制作原子弹
燃烧弹的制作方法
怎么自制燃烧弹
TNT炸弹制作
高爆炸药基本配方
爆破和杀伤燃烧弹
炸弹制作从入门到精
写的炸弹制作教程
原子弹制作 方法
教你制作原子弹
下硝化甘油的制作方法
DIY原子弹
原子弹制作
炸药及其制造方法
ATOM弹制造
三分钟教你原子弹
火药原理
简易炸弹
简易燃烧弹
土炸药成份
你怎么用土办法做武器
燃烧弹制作
燃烧瓶的制作方法
炸弹制作手册 硫酸
原子弹制作方法DIY
汽油三分之一白糖混合
炸药的制作配方
燃烧弹的制作方
炸药的配方
如何自制燃烧弹
标准炸弹教程
黑火药和硝酸钾农药混合
恐怖分子自己制造炸弹
手柄制作炸弹引爆器
制作炸弹首先要
燃烧瓶制作
出售炸药QQ
出售气枪
出售气枪 QQ
出售气枪 电话
出售手枪
出售手枪 QQ
出售手枪 电话
出售猎枪
出售猎枪 QQ
出售猎枪 电话
出售汽枪
出售步枪
出售狙击枪
出售手狗
出售气狗
出售猎狗
手枪出售联系电话
64式手枪出售
92式手枪出售
出售:高仿真枪
出售54式手枪
出售M1911
出售各类猎狗
出售国产军用54手枪
出售火枪 游戏
出售进口金属枪模
出售仿真枪
出售麻醉枪免收任何定金
出售手枪=货到付款
出售外国枪模
出售袖珍手枪
娥眉气枪出售
防身手枪QQ
防身武器手枪
仿真枪QQ
钢珠枪小口径步枪
高压狗QQ
高压气枪,气枪子弹
高压气枪|电狗专卖
高压气枪|气枪货到付款
高压气枪专卖店
各类军用枪
各类军用枪支
各式气枪出售
工字牌气枪出售专卖
气枪
工字汽狗麻醉枪
供应军用手枪
供应汽枪
购买枪支QQ
国产汽狗专卖|气枪货
集团出售手枪
集团出售手枪气枪
进口气枪,气枪子弹
军用54出售
军用77出售
军用手枪钢珠枪
里有汽枪出售
猎枪出售/
猎枪仿真枪QQ
猎枪麻醉枪钢珠枪
猎枪哪里有卖
猎枪手枪买卖
猎枪销售手枪销售气枪
猎枪专卖店
猎枪子弹底火专卖
麻醉枪出售可验货
麻醉枪猎枪军用
买卖54狗
买卖64狗
买卖警察枪支
买卖军狗
买卖军用枪支
卖64手枪
卖92手枪
卖钢珠枪QQ
哪里能买到自制手枪
哪里有钢珠枪
哪里有连发猎枪买卖
哪里有卖双管猎
哪里有气枪卖
哪里有枪出售
哪里有真枪出售
哪里有真枪卖买
哪能买到真枪
期出售手枪气枪猎
气狗 高压气枪
气狗出售 进口气狗
气枪专卖网
气枪/出售/专卖网
气枪/猎枪/钢珠枪
气枪仿真枪出售
气枪购买|气枪组装
气枪货到付款,汽狗出售
气枪价格 仿真气枪
气枪价格气枪专卖店
气枪看货加QQ
气枪联系QQ
气枪猎枪麻醉枪
气枪迷魂药
汽狗高压汽枪
铅弹 上海工字气枪
全金属仿真枪专卖
热武器QQ
三箭气枪出售
手枪气* 枪猎
手槍买卖自制手枪
售枪购买手枪
售手枪QQ
司马仿真枪模型QQ
淘宝气枪货到付款
提供气狗专卖店
提供专业及时的气狗
秃鹰气枪货到付款
锡峰气枪出售
仙鹤气枪出售
销售/专卖/买卖77式手枪
销售电手狗
销售气手狗
销售小口径步枪
销售运动步枪
小口径秃鹰沙漠
有军用枪支出售
长期出 售手枪
折叠狗QQ
转让 猎枪
子弹货到付款
自制手枪哪里买
自制手枪哪里有卖
阻击枪/汽枪/高压气枪
组装手枪
最新销售汽狗
出售警用手铐|仿真枪
猎枪|真枪
手枪|阻击枪
弓弩专营
弓弩专卖网货到付款
弓弩专卖网
弓弩专卖货到付款
弓弩专卖店网
弓弩专卖店
弓弩专卖
弓弩制作
弓弩直销
弓弩有限公司
弓弩营销中心
弓弩一百专卖店
弓弩销售
弓弩网
弓弩网
弓弩图纸
弓弩特许经销
弓弩狩猎网
自制手弩
追风弓弩麻醉箭专卖
专业弓弩网
中国战神军用弓弩
中国弩弓专卖
中国弓弩专卖网
中国弓弩直销
中国弓弩网
中国弓弩狩猎网
中国弓驽网
制作简易弓弩
郑州弓弩专卖
赵氏弓弩专卖网
赵氏弓弩专卖店
赵氏弓弩专卖
赵氏弓弩销售
小型弓弩专卖店
小猎人弓弩网
狩猎器材弓弩专卖
狩猎器材弓弩
狩猎弓弩专卖网
狩猎弓弩专卖
狩猎弓弩麻醉箭
手枪式折叠三用弩
三利达弓弩专卖网
三利达弓弩直营
三利达弓弩配件
三步倒药箭批发
三步倒弩箭专卖
三步倒麻醉弩箭销售
三步倒麻醉箭专卖
三步倒麻醉箭
三步倒捕狗药
军用弓弩专卖网
军用弓弩专卖店
军用弓弩批发
军用弓弩公司
供应三利达弓弩麻醉箭
供应三步倒麻醉箭
供应秦氏弓弩
供应弩用麻醉箭
供应弩捕狗箭
供应麻醉箭三步倒
供应麻醉箭批发
供应麻醉箭
供应军用弩折叠弩
供应军用弓弩专卖
供应精品弓弩
供应弓弩麻醉箭
供应弓弩
供应钢珠弓弩
弓弩商城专卖
弓弩商城
弓弩亲兄弟货到付款
弓弩批发
弓弩免定金货到付款
弓弩麻醉箭
弓弩麻醉镖
弓弩论坛
钢珠弓弩专卖网
钢珠弓弩专卖店
打狗弓弩三步倒
麻醉弓弩专卖店
出售军刀
出售军刺
出售弹簧刀
出售三棱刀
出售跳刀
军刀网
南方军刀网
户外军刀网
三棱军刺专卖
出售开山刀军刺
西点军刀网
军刀专
戈博军刀
阿兰德龙户外
出售军品军刀
勃朗宁军刀
军刀军品网
阿兰得龙野营刀具网
出售军刺军刀
警用刀具出售
折刀专卖网
阳江军品军刀网
野营刀专卖
砍刀精品折刀专卖
匕首蝴蝶甩刀专卖
军刀专卖军刺
军刀专卖刀具批发
军刀图片砍刀
军刀网军刀专卖
军刀价格军用刀具
军品军刺网
军刀军刺甩棍
阳江刀具批发网
北方先锋军刀
正品军刺出售
野营军刀出售
开山刀砍刀出售
仿品军刺出售
军刀直刀专卖
手工猎刀专卖
自动跳刀专卖
军刀电棍销售
军刀甩棍销售
美国军刀出售
极端武力折刀
防卫棍刀户外刀具
阿兰德龙野营刀
仿品军刺网
野营砍刀户外军刀
手工猎刀户外刀具
中国户外刀具网
西点军品军刀网
野营开山刀军刺
三利达弓弩军刀
尼泊尔军刀出售
防卫野营砍刀出售
防卫著名军刀出售
防卫棍刀出售
防卫甩棍出售
防卫电棍出售
军刺野营砍刀出售
著名精品折刀出售
战术军刀出售
刺刀专卖网
户外军刀出售
阳江刀具直销网
冷钢刀具直销网
防卫刀具直销网
极端武力直销网
刀具直销网
军刀直销网
直刀匕首直销网
军刀匕首直销网
折刀砍刀军品网
野营刀具军品网
阳江刀具军品网
冷钢刀具军品网
防卫刀具军品网
极端武力军品网
军用刀具军品网
军刀直刀军品网
折刀砍刀专卖
野营刀具专卖
阳江刀具专卖
冷钢刀具专卖
防卫刀具专卖
出售美军现役军刀

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,304 @@
爱液
按摩棒
拔出来
爆草
包二奶
暴干
暴奸
暴乳
爆乳
暴淫
被操
被插
被干
逼奸
仓井空
插暴
操逼
操黑
操烂
肏你
肏死
操死
操我
厕奴
插比
插b
插逼
插进
插你
插我
插阴
潮吹
潮喷
成人电影
成人论坛
成人色情
成人网站
成人文学
成人小说
艳情小说
成人游戏
吃精
抽插
春药
大波
大力抽送
大乳
荡妇
荡女
盗撮
发浪
放尿
肥逼
粉穴
风月大陆
干死你
干穴
肛交
肛门
龟头
裹本
国产av
好嫩
豪乳
黑逼
后庭
后穴
虎骑
换妻俱乐部
黄片
几吧
鸡吧
鸡巴
鸡奸
妓女
奸情
叫床
脚交
精液
就去日
巨屌
菊花洞
菊门
巨奶
巨乳
菊穴
开苞
口爆
口活
口交
口射
口淫
裤袜
狂操
狂插
浪逼
浪妇
浪叫
浪女
狼友
聊性
凌辱
漏乳
露b
乱交
乱伦
轮暴
轮操
轮奸
裸陪
买春
美逼
美少妇
美乳
美腿
美穴
美幼
秘唇
迷奸
密穴
蜜穴
蜜液
摸奶
摸胸
母奸
奈美
奶子
男奴
内射
嫩逼
嫩女
嫩穴
捏弄
女优
炮友
砲友
喷精
屁眼
前凸后翘
强jian
强暴
强奸处女
情趣用品
情色
拳交
全裸
群交
人妻
人兽
日逼
日烂
肉棒
肉逼
肉唇
肉洞
肉缝
肉棍
肉茎
肉具
揉乳
肉穴
肉欲
乳爆
乳房
乳沟
乳交
乳头
骚逼
骚比
骚女
骚水
骚穴
色逼
色界
色猫
色盟
色情网站
色区
色色
色诱
色欲
色b
少年阿宾
射爽
射颜
食精
释欲
兽奸
兽交
手淫
兽欲
熟妇
熟母
熟女
爽片
双臀
死逼
丝袜
丝诱
松岛枫
酥痒
汤加丽
套弄
体奸
体位
舔脚
舔阴
调教
偷欢
推油
脱内裤
文做
舞女
无修正
吸精
夏川纯
相奸
小逼
校鸡
小穴
小xue
性感妖娆
性感诱惑
性虎
性饥渴
性技巧
性交
性奴
性虐
性息
性欲
胸推
穴口
穴图
亚情
颜射
阳具
杨思敏
要射了
夜勤病栋
一本道
一夜欢
一夜情
一ye情
阴部
淫虫
阴唇
淫荡
阴道
淫电影
阴阜
淫妇
淫河
阴核
阴户
淫贱
淫叫
淫教师
阴茎
阴精
淫浪
淫媚
淫糜
淫魔
淫母
淫女
淫虐
淫妻
淫情
淫色
淫声浪语
淫兽学园
淫书
淫术炼金士
淫水
淫娃
淫威
淫亵
淫样
淫液
淫照
阴b
应召
幼交
欲火
欲女
玉乳
玉穴
援交
原味内衣
援助交际
招鸡
招妓
抓胸
自慰
作爱
a片
fuck
gay片
g点
h动画
h动漫
失身粉
淫荡自慰器

View File

@@ -0,0 +1,929 @@
爱女人
爱液
按摩棒
拔出来
爆草
包二奶
暴干
暴奸
暴乳
爆乳
暴淫
被插
被操
被干
逼奸
仓井空
插暴
操逼
操黑
操烂
肏你
肏死
操死
操我
厕奴
插比
插b
插逼
插进
插你
插我
插阴
潮吹
潮喷
成人dv
成人电影
成人论坛
成人小说
成人电
成人电影
成人卡通
成人聊
成人片
成人视
成人图
成人文
成人小
成人电影
成人论坛
成人色情
成人网站
成人文学
成人小说
艳情小说
成人游戏
吃精
赤裸
抽插
扌由插
抽一插
春药
大波
大力抽送
大乳
荡妇
荡女
盗撮
多人轮
发浪
放尿
肥逼
粉穴
封面女郎
风月大陆
干死你
干穴
肛交
肛门
龟头
裹本
国产av
好嫩
豪乳
黑逼
后庭
后穴
虎骑
花花公子
换妻俱乐部
黄片
几吧
鸡吧
鸡巴
鸡奸
寂寞男
寂寞女
妓女
激情
集体淫
奸情
叫床
脚交
金鳞岂是池中物
金麟岂是池中物
精液
就去日
巨屌
菊花洞
菊门
巨奶
巨乳
菊穴
开苞
口爆
口活
口交
口射
口淫
裤袜
狂操
狂插
浪逼
浪妇
浪叫
浪女
狼友
聊性
流淫
铃木麻
凌辱
漏乳
露b
乱交
乱伦
轮暴
轮操
轮奸
裸陪
买春
美逼
美少妇
美乳
美腿
美穴
美幼
秘唇
迷奸
密穴
蜜穴
蜜液
摸奶
摸胸
母奸
奈美
奶子
男奴
内射
嫩逼
嫩女
嫩穴
捏弄
女优
炮友
砲友
喷精
屁眼
品香堂
前凸后翘
强jian
强暴
强奸处女
情趣用品
情色
拳交
全裸
群交
惹火身材
人妻
人兽
日逼
日烂
肉棒
肉逼
肉唇
肉洞
肉缝
肉棍
肉茎
肉具
揉乳
肉穴
肉欲
乳爆
乳房
乳沟
乳交
乳头
三级片
骚逼
骚比
骚女
骚水
骚穴
色逼
色界
色猫
色盟
色情网站
色区
色色
色诱
色欲
色b
少年阿宾
少修正
射爽
射颜
食精
释欲
兽奸
兽交
手淫
兽欲
熟妇
熟母
熟女
爽片
爽死我了
双臀
死逼
丝袜
丝诱
松岛枫
酥痒
汤加丽
套弄
体奸
体位
舔脚
舔阴
调教
偷欢
偷拍
推油
脱内裤
文做
我就色
无码
舞女
无修正
吸精
夏川纯
相奸
小逼
校鸡
小穴
小xue
写真
性感妖娆
性感诱惑
性虎
性饥渴
性技巧
性交
性奴
性虐
性息
性欲
胸推
穴口
学生妹
穴图
亚情
颜射
阳具
杨思敏
要射了
夜勤病栋
一本道
一夜欢
一夜情
一ye情
阴部
淫虫
阴唇
淫荡
阴道
淫电影
阴阜
淫妇
淫河
阴核
阴户
淫贱
淫叫
淫教师
阴茎
阴精
淫浪
淫媚
淫糜
淫魔
淫母
淫女
淫虐
淫妻
淫情
淫色
淫声浪语
淫兽学园
淫书
淫术炼金士
淫水
淫娃
淫威
淫亵
淫样
淫液
淫照
阴b
应召
幼交
幼男
幼女
欲火
欲女
玉女心经
玉蒲团
玉乳
欲仙欲死
玉穴
援交
原味内衣
援助交际
张筱雨
招鸡
招妓
中年美妇
抓胸
自拍
自慰
作爱
18
99bb
a4u
a4y
adult
amateur
anal
a片
fuck
gay片
g点
g片
hardcore
h动画
h动漫
incest
porn
secom
sexinsex
sm女王
xiao77
xing伴侣
tokyohot
yin荡
贱人
装b
大sb
傻逼
傻b
煞逼
煞笔
刹笔
傻比
沙比
欠干
婊子养的
我日你
我操
我草
卧艹
卧槽
爆你菊
艹你
cao你
你他妈
真他妈
别他吗
草你吗
草你丫
操你妈
擦你妈
操你娘
操他妈
日你妈
干你妈
干你娘
娘西皮
狗操
狗草
狗杂种
狗日的
操你祖宗
操你全家
操你大爷
妈逼
你麻痹
麻痹的
妈了个逼
马勒
狗娘养
贱比
贱b
下贱
死全家
全家死光
全家不得好死
全家死绝
白痴
无耻
sb
杀b
你吗b
你妈的
婊子
贱货
人渣
混蛋
媚外
和弦
兼职
限量
铃声
性伴侣
男公关
火辣
精子
射精
诱奸
强奸
做爱
性爱
发生关系
按摩
快感
处男
猛男
少妇
屁股
下体
a片
内裤
浑圆
咪咪
发情
刺激
白嫩
粉嫩
兽性
风骚
呻吟
sm
阉割
高潮
裸露
不穿
一丝不挂
脱光
干你
干死
我干
裙中性运动
乱奸
乱伦
乱伦类
乱伦小
伦理大
伦理电影
伦理毛
伦理片
裸聊
裸聊网
裸体写真
裸舞视
裸照
美女裸体
美女写真
美女上门
美艳少妇
妹按摩
妹上门
迷幻药
迷幻藥
迷昏口
迷昏药
迷昏藥
迷魂香
迷魂药
迷魂藥
迷奸粉
迷奸药
迷情粉
迷情水
迷情药
迷药
迷藥
谜奸药
骚妇
骚货
骚浪
骚女
骚嘴
色电影
色妹妹
色情表演
色情电影
色情服务
色情图片
色情小说
色情影片
色情表演
色情电影
色情服务
色情片
色视频
色小说
性伴侣
性服务
性福情
性感少
性伙伴
性交
性交视频
性交图片
性奴
性奴集中营
性虐
阴唇
阴道
阴蒂
阴户
阴间来电
阴茎
阴茎增大
阴茎助勃
阴毛
陰唇
陰道
陰戶
淫荡
淫荡美女
淫荡视频
淫荡照片
淫乱
淫靡
淫魔
淫魔舞
淫女
淫情女
淫肉
淫騷妹
淫兽
淫兽学
淫水
淫穴
morphine
摇头丸
迷药
乖乖粉
narcotic
麻醉药
精神药品
爱女人
爱液
按摩棒
拔出来
爆草
包二奶
暴干
暴奸
暴乳
爆乳
暴淫
被操
被插
被干
逼奸
仓井空
插暴
操逼
操黑
操烂
肏你
肏死
操死
操我
厕奴
插比
插b
插逼
插进
插你
插我
插阴
潮吹
潮喷
成人电影
成人论坛
成人色情
成人网站
成人文学
成人小说
艳情小说
成人游戏
吃精
赤裸
抽插
扌由插
抽一插
春药
大波
大力抽送
大乳
荡妇
荡女
盗撮
多人轮
发浪
放尿
肥逼
粉穴
封面女郎
风月大陆
干死你
干穴
肛交
肛门
龟头
裹本
国产av
好嫩
豪乳
黑逼
后庭
后穴
虎骑
花花公子
换妻俱乐部
黄片
几吧
鸡吧
鸡巴
鸡奸
寂寞男
寂寞女
妓女
激情
集体淫
奸情
叫床
脚交
金鳞岂是池中物
金麟岂是池中物
精液
就去日
巨屌
菊花洞
菊门
巨奶
巨乳
菊穴
开苞
口爆
口活
口交
口射
口淫
裤袜
狂操
狂插
浪逼
浪妇
浪叫
浪女
狼友
聊性
流淫
铃木麻
凌辱
漏乳
露b
乱交
乱伦
轮暴
轮操
轮奸
裸陪
买春
美逼
美少妇
美乳
美腿
美穴
美幼
秘唇
迷奸
密穴
蜜穴
蜜液
摸奶
摸胸
母奸
奈美
奶子
男奴
内射
嫩逼
嫩女
嫩穴
捏弄
女优
炮友
砲友
喷精
屁眼
品香堂
前凸后翘
强jian
强暴
强奸处女
情趣用品
情色
拳交
全裸
群交
惹火身材
人妻
人兽
日逼
日烂
肉棒
肉逼
肉唇
肉洞
肉缝
肉棍
肉茎
肉具
揉乳
肉穴
肉欲
乳爆
乳房
乳沟
乳交
乳头
三级片
骚逼
骚比
骚女
骚水
骚穴
色逼
色界
色猫
色盟
色情网站
色区
色色
色诱
色欲
色b
少年阿宾
少修正
射爽
射颜
食精
释欲
兽奸
兽交
手淫
兽欲
熟妇
熟母
熟女
爽片
爽死我了
双臀
死逼
丝袜
丝诱
松岛枫
酥痒
汤加丽
套弄
体奸
体位
舔脚
舔阴
调教
偷欢
偷拍
推油
脱内裤
文做
我就色
无码
舞女
无修正
吸精
夏川纯
相奸
小逼
校鸡
小穴
小xue
写真
性感妖娆
性感诱惑
性虎
性饥渴
性技巧
性交
性奴
性虐
性息
性欲
胸推
穴口
学生妹
穴图
亚情
颜射
阳具
杨思敏
要射了
夜勤病栋
一本道
一夜欢
一夜情
一ye情
阴部
淫虫
阴唇
淫荡
阴道
淫电影
阴阜
淫妇
淫河
阴核
阴户
淫贱
淫叫
淫教师
阴茎
阴精
淫浪
淫媚
淫糜
淫魔
淫母
淫女
淫虐
淫妻
淫情
淫色
淫声浪语
淫兽学园
淫书
淫术炼金士
淫水
淫娃
淫威
淫亵
淫样
淫液
淫照
阴b
应召
幼交
幼男
幼女
欲火
欲女
玉女心经
玉蒲团
玉乳
欲仙欲死
玉穴
援交
原味内衣
援助交际
张筱雨
招鸡
招妓
中年美妇
抓胸
自拍
自慰
作爱
18
99bb
a4u
a4y
adult
amateur
anal
a片
fuck
gay片
g点
g片
hardcore
h动画
h动漫
incest
porn
secom
sexinsex
sm女王
xiao77
xing伴侣
tokyohot
yin荡

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,244 @@
腐败
贪污
gcd
共贪党
gongchandang
阿共
共一产一党
产党共
公产党
工产党
共c党
共x党
供产
共铲
共惨
供铲党
供铲谠
供铲裆
共残党
共残主义
共产主义的幽灵
拱铲
老共
中珙
中gong
gc党
贡挡
gong党
g产
狗产蛋
共残裆
恶党
邪党
共产专制
共产王朝
裆中央
土共
土g
共狗
g匪
共匪
仇共
共产党腐败
共产党专制
共产党的报应
共产党的末日
共产党专制
communistparty
症腐
政腐
政付
正府
政俯
政f
zhengfu
政zhi
挡中央
档中央
中国zf
中央zf
国wu院
中华帝国
gong和
大陆官方
北京政权
刘志军
张曙
刘志军
买别墅
玩女人
贪20亿
许宗衡
贪财物
李启红
贪腐财富
落马
高官名单
陈希同
贪污
玩忽职守
有期徒刑
陈良宇
受贿罪
滥用职权
有期徒刑
没收个人财产
成克杰
死刑
程维高
严重违纪
开除党籍
撤销职务
刘方仁
无期徒刑
倪献策
徇私舞弊
梁湘
以权谋私
撤职
李嘉廷
死刑缓期
张国光
韩桂芝
宋平顺
自杀
黄瑶
双规
陈绍基
判处死刑
剥夺政治权利终身
没收个人全部财产
石兆彬
侯伍杰
王昭耀
剥夺政治权利
杜世成
沈图
叛逃美国
罗云光
起诉
张辛泰
李效时
边少斌
徐鹏航
违纪
收受股票
王乐毅
李纪周
郑光迪
田凤山
邱晓华
郑筱萸
孙鹤龄
蓝田造假案
于幼军
留党察看
何洪达
朱志刚
杨汇泉
官僚主义
徐炳松
托乎提沙比尔
王宝森
经济犯罪
畏罪自杀
陈水文
孟庆平
胡长清
朱川
许运鸿
丘广钟
刘知炳
丛福奎
王怀忠
巨额财产
来源不明罪
李达昌
刘长贵
王钟麓
阿曼哈吉
付晓光
自动辞
刘克田
吕德彬
刘维明
双开
刘志华
孙瑜
李堂堂
韩福才 青海
欧阳德 广东
韦泽芳 海南
铁英 北京
辛业江 海南
于飞 广东
姜殿武 河北
秦昌典 重庆
范广举 黑龙江
张凯广东
王厚宏海南
陈维席安徽
王有杰河南
王武龙江苏
米凤君吉林
宋勇辽宁
张家盟浙江
马烈孙宁夏
黄纪诚北京
常征贵州
王式惠重庆
周文吉
王庆录广西
潘广田山东
朱作勇甘肃
孙善武河南
宋晨光江西
梁春禄广西政协
鲁家善 中国交通
金德琴 中信
李大强 神华
吴文英 纺织
查克明 华能
朱小华光大
高严 国家电力
王雪冰
林孔兴
刘金宝
张恩照
陈同海
康日新
王益
张春江
洪清源
平义杰
李恩潮
孙小虹
陈忠
慕绥新
田凤岐
麦崇楷
柴王群
吴振汉
张秋阳
徐衍东
徐发 黑龙江
张宗海
丁鑫发
徐国健
李宝金
单平
段义和
荆福生
陈少勇
黄松有
皮黔生
王华元
王守业
刘连昆
孙晋美
邵松高
肖怀枢
刘广智 空军
姬胜德 总参
廖伯年 北京

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,64 @@
package go_sensitive_word
import "regexp"
// HasEmail 判断字符串中是否存在邮箱地址
func HasEmail(s string) bool {
emailRegex := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}`)
return emailRegex.MatchString(s)
}
// MaskEmail 将字符串中存在的邮箱地址替换成 "*"
func MaskEmail(s string) string {
emailRegex := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}`)
masked := emailRegex.ReplaceAllStringFunc(s, func(email string) string {
return "***"
})
return masked
}
// HasURL 判断字符串中是否存在网址
func HasURL(s string) bool {
urlRegex := regexp.MustCompile(`https?://[^\s]+`)
return urlRegex.MatchString(s)
}
// MaskURL 将字符串中存在的网址替换成 "*"
func MaskURL(s string) string {
urlRegex := regexp.MustCompile(`https?://[^\s]+`)
masked := urlRegex.ReplaceAllStringFunc(s, func(url string) string {
return "***"
})
return masked
}
// HasDigit 判断字符串中是否存在指定个数的数字(大于等于该数字)
func HasDigit(s string, count int) bool {
digitRegex := regexp.MustCompile(`\d`)
matches := digitRegex.FindAllString(s, -1)
return len(matches) >= count
}
// MaskDigit 将字符串中存在的数字替换成 "*"
func MaskDigit(s string) string {
digitRegex := regexp.MustCompile(`\d`)
masked := digitRegex.ReplaceAllStringFunc(s, func(digit string) string {
return "*"
})
return masked
}
// HasWechatID 判断字符串中是否存在微信号
func HasWechatID(s string) bool {
wechatRegex := regexp.MustCompile(`[a-zA-Z][a-zA-Z0-9_-]{5,19}`)
return wechatRegex.MatchString(s)
}
// MaskWechatID 将字符串中存在的微信号替换成 "*"
func MaskWechatID(s string) string {
wechatRegex := regexp.MustCompile(`[a-zA-Z][a-zA-Z0-9_-]{5,19}`)
masked := wechatRegex.ReplaceAllStringFunc(s, func(wechatID string) string {
return "***"
})
return masked
}

View File

@@ -0,0 +1,48 @@
package go_sensitive_word
import (
"fmt"
"testing"
)
func TestEmail(t *testing.T) {
input := "我的邮箱是example@example.com你的是test@test.com。"
if HasEmail(input) {
masked := MaskEmail(input)
fmt.Println("替换后的字符串:", masked)
} else {
fmt.Println("字符串中不存在邮箱。")
}
}
func TestURL(t *testing.T) {
input := "我的网址是http://example.com你的是https://test.com。"
if HasURL(input) {
masked := MaskURL(input)
fmt.Println("替换后的字符串:", masked)
} else {
fmt.Println("字符串中不存在网址。")
}
}
func TestDigit(t *testing.T) {
input := "我的手机号码是1234567890你的是9876543210。"
if HasDigit(input, 3) {
masked := MaskDigit(input)
fmt.Println("替换后的字符串:", masked)
} else {
fmt.Println("字符串中不存在指定个数的数字。")
}
}
func TestWechat(t *testing.T) {
input := "我的是my_wechat123你的微信是your-wechat-789。"
if HasWechatID(input) {
masked := MaskWechatID(input)
fmt.Println("替换后的字符串:", masked)
} else {
fmt.Println("字符串中不存在微信号。")
}
}

View File

@@ -14,6 +14,7 @@ use (
./common/utils/log ./common/utils/log
./common/utils/sturc ./common/utils/sturc
./common/utils/xml ./common/utils/xml
./common/utils/go-sensitive-word-1.3.3
./logic ./logic
./login ./login
./modules ./modules

View File

@@ -2,6 +2,7 @@ package controller
import ( import (
"blazing/common/socket/errorcode" "blazing/common/socket/errorcode"
"blazing/cool"
"blazing/logic/service" "blazing/logic/service"
"blazing/logic/service/login" "blazing/logic/service/login"
blservice "blazing/modules/blazing/service" blservice "blazing/modules/blazing/service"
@@ -10,6 +11,6 @@ import (
// 处理命令: 1001 // 处理命令: 1001
func (h *Controller) CreatePlayer(data *login.CreatePlayerInboundInfo, c *service.Conn) (result *login.CreatePlayerOutInfo, err errorcode.ErrorCode) { func (h *Controller) CreatePlayer(data *login.CreatePlayerInboundInfo, c *service.Conn) (result *login.CreatePlayerOutInfo, err errorcode.ErrorCode) {
blservice.NewUserService(data.Head.UserID).Reg(data.Nickname, data.Color) blservice.NewUserService(data.Head.UserID).Reg(cool.Filter.Replace(data.Nickname, '*'), data.Color)
return result, 0 return result, 0
} }