网站怎么做敏感词过滤,敏感词过滤的思路和实践

news2024/11/13 8:54:22

敏感词过滤是一种在网站、应用程序或平台中实现内容审查的技术,用于阻止用户发布包含不适当、非法或不符合政策的内容。我们在实际的网站运营过程中,往往需要担心某些用户发布的内容中包含敏感词汇,这些词汇往往会导致我们的网站被用户举报,甚至被服务器运营商封禁、被相关部门约谈、罚款等。为了防止这种情况发生,我们需要对敏感词汇进行过滤。

敏感词过滤的实现涉及多个步骤,既包括技术实现,也包括策略制定。以下以安企CMS的敏感词过滤设计为例,展开说明。

定义敏感词库

敏感词库的构成,一般包含涉及SE情的、涉及政治的、涉及FAN动暴力的、涉及广告法的词汇。根据我们网站的不同定义,可以收集集中一部分获取全部的词汇。一般我们可以从网上下载或手动收集这些词汇。

在敏感词库的收集方面,安企CMS设计成了手动收集+系统同步双模式。默认系统没有敏感词,可以选择从官网同步官网预设好的敏感词库,也可以手动添加自定义的敏感词。

请添加图片描述

敏感词过滤的算法设计

针对日常的企业网站,我们不必要采用上下文分析、语义分析等 AI 算法。为了简便起见,我们可以使用最常见,也是最简单是的关键词匹配算法,为了更大的适应规则,我们还可以增加使用正则匹配类的模糊匹配算法来实现。

安企CMS 采用的就是关键词匹配 + 正则模糊匹配双模式进行处理。具体的替换代码如下:

具体代码是 GoLang 代码,因为 安企CMS 是 Go 语言开发,因此代码以 Go 语言为例。

func ReplaceSensitiveWords(content []byte, sensitiveWords []string) []byte {
  // 如果敏感词库为空,或内容为空,直接返回
	if len(sensitiveWords) == 0 || len(content) == 0 {
		return content
	}
  // 顶一个结构体,用于存储替换结果
	type replaceType struct {
		Key   []byte
		Value []byte
	}
	var replacedMatch []*replaceType
	numCount := 0
	//忽略所有html标签的属性,这是为了防止将标签属性替换成为*,导致页面出错
	reg, _ := regexp.Compile("(?i)<!?/?[a-z0-9-]+(\\s+[^>]+)?>")
	content = reg.ReplaceAllFunc(content, func(s []byte) []byte {
		key := []byte(fmt.Sprintf("{$%d}", numCount))
		replacedMatch = append(replacedMatch, &replaceType{
			Key:   key,
			Value: s,
		})
		numCount++

		return key
	})
	// 替换所有敏感词为星号
	for _, word := range sensitiveWords {
		if len(word) == 0 {
			continue
		}
		if bytes.Contains(content, []byte(word)) {
			content = bytes.ReplaceAll(content, []byte(word), bytes.Repeat([]byte("*"), utf8.RuneCountInString(word)))
		} else {
			// 支持正则表达式替换,定义正则表达式以{开头}结束,如:{[1-9]\d{4,10}}
			if strings.HasPrefix(word, "{") && strings.HasSuffix(word, "}") && len(word) > 2 {
				// 移除首尾花括号
				newWord := word[1 : len(word)-1]
				re, err := regexp.Compile(newWord)
				if err == nil {
					content = re.ReplaceAll(content, bytes.Repeat([]byte("*"), utf8.RuneCountInString(word)))
				}
				continue
			}
		}
	}
	// 将上面忽略的html标签属性还原回来
	for i := len(replacedMatch) - 1; i >= 0; i-- {
		content = bytes.Replace(content, replacedMatch[i].Key, replacedMatch[i].Value, 1)
	}

	return content
}

敏感词替换的时机

敏感词替换的可以在以下几种时机下进行:

  1. 提交实时过滤:用户在提交内容时,系统会自动检测并过滤敏感词。
  2. 批量过滤:系统定时扫描数据库中的内容,对敏感词进行批量过滤。
  3. 显示时过滤:在显示内容的时候,系统会自动检测并过滤敏感词。

安企CMS 使用主要使用的是第三种时机方案。在页面渲染的时候,系统自动过滤敏感词。这也是为了考虑有不同的数据输入来源,以及敏感词库的动态更新,在提交时实时过滤的话,后来补充的敏感词就无法生效,而批量过滤也可能经常因为不及时导致的敏感词失效。因此在显示时过滤处理更严谨一些,虽然这么做会牺牲一些性能。

为了实现显示时过滤敏感词,安企CMS重写了 ExecuteWriter 输出函数,具体的代码如下:

func (s *DjangoEngine) ExecuteWriter(w io.Writer, filename string, _ string, bindingData interface{}) error {
	// 如果开启了debug模式,每次渲染的时候,重新解析模板。
	if s.reload {
		if err := s.LoadStart(true); err != nil {
			return err
		}
	}
	ctx := w.(iris.Context)
	currentSite := provider.CurrentSite(ctx)
	if tmpl := s.fromCache(currentSite.Id, filename); tmpl != nil {
		data, err := tmpl.ExecuteBytes(getPongoContext(bindingData))
		if err != nil {
			return err
		}
		// 对data进行敏感词替换
		data = currentSite.ReplaceSensitiveWords(data)
		buf := bytes.NewBuffer(data)
		_, err = buf.WriteTo(w)
		return err
	}
  // 如果模板不存在,返回错误
	return view2.ErrNotExist{Name: filename, IsLayout: false, Data: bindingData}
}

以上的敏感词过滤的思路和实践。在实际使用过程中,我们应该根据实际需求进行优化和调整。在机器自动过滤的基础上,增加人工审核部分内容,定期巡查,特别是那些容易产生歧义或涉及深度语义分析的内容。

敏感词过滤是一个复杂且动态的过程,既需要高效的技术手段,也需要灵活应变的策略以适应不断变化的语言环境和政策要求。希望以上内容能帮助到您。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2052140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JVM的组成

JVM 运行在操作系统之上 java二进制字节码文件的运行环境 JVM的组成部分 java代码在编写完成后编译成字节码文件通过类加载器 来到运行数据区,主要作用是加载字节码到内存 包含 方法区/元空间 堆 程序计数器,虚拟机栈,本地方法栈等等 随后来到执行引擎,主要作用是翻译字…

系统工程与信息系统(上)

系统工程 概念 【系统工程】是一种组织管理技术。 【系统工程】是为了最好的实现系统的目的&#xff0c;对系统的组成要素、组织结构、信息流、控制机构进行分析研究的科学方法。 【系统工程】从整体出发、从系统观念出发&#xff0c;以求【整体最优】 【系统工程】利用计算机…

信息搜集--敏感文件Banner

免责声明:本文仅做分享参考... git安装: Windows10下安装Git_win10安装git好慢-CSDN博客 git目录结构: Git 仓库目录 .git 详解-CSDN博客 敏感目录泄露 1-git泄露 Git是一个开源的分布式版本控制系统,我们简单的理解为Git 是一个*内容寻址文件系统*&#xff0c;也就是说Gi…

二十四、解释器模式

文章目录 1 基本介绍2 案例2.1 Instruction 接口2.2 StartInstruction 类2.3 PrimitiveInstruction 类2.4 RepeatInstruction 类2.5 InstructionList 类2.6 Context 类2.7 Client 类2.8 Client 类的运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 AbstractExpression ( 抽象…

Nexpose漏扫

免责声明:本文仅做分享参考... nexpose官网: Nexpose On-Premise Vulnerability Scanner - Rapid7 Rapid7的Nexpose是一款非常专业的漏洞扫描软件。有community版本和enterprise版本。 其中community版是免费的&#xff0c;但是功能简单&#xff1b;enterprise版本功能强大.…

适用于 Windows 10 的最佳免费数据恢复软件是什么?

有没有适用于 Windows 10 的真正免费的数据恢复软件&#xff1f; 丢失重要数据&#xff0c;无论是由于硬件问题、软件问题、意外删除、格式化还是病毒和恶意软件&#xff0c;确实很麻烦。当你面临数据丢失时&#xff0c;你可能真心希望找到一款免费的数据恢复软件&#xff0c;…

【C++指南】深入剖析:C++中的引用

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言&#xff1a; 一、引用的基本概念 1. 定义与特性 2. 语法与声明 二、引用的进阶用法 1. 函…

Python高手参考手册:迭代器协议详解

在Python中&#xff0c;迭代器协议提供了一种灵活的方式来遍历容器中的元素。本文将详细介绍迭代器协议的基础知识、其实现机制以及一些实用的应用案例。 迭代器协议概述 1.1 迭代器与迭代协议 迭代器协议定义了如何遍历容器中的元素。在Python中&#xff0c;任何实现了迭代…

Android:使用Gson常见问题(包含解决将Long型转化为科学计数法的问题)

一、解决将Long型转化为科学计数法的问题 1.1 场景 将一个对象转为Map类型时&#xff0c;调用Gson.fromJson发现&#xff0c;原来对象中的long类型的personId字段&#xff0c;被解析成了科学计数法&#xff0c;导致请求接口失败&#xff0c;报参数错误。 解决结果图 1.2、Exa…

轻松掌握域名系统(DNS):基础小白的入门指南

文章目录 域名系统概述DNS 的发展和结构DNS 的服务和功能互联网的域名结构域名服务器的类型和功能域名解析的过程DNS资源记录小结 域名系统概述 域名系统&#xff08;Domain Name System&#xff0c;DNS&#xff09; 是一种核心服务&#xff0c;它使得网络应用能够在应用层使用…

腾讯地图SDK Android版开发 6 显示覆盖物

腾讯地图SDK Android版开发 6 显示覆盖物 前言地图类中覆盖物的接口覆盖物类Marker示例Polyline示例Polygon示例Arc示例Circle示例移除示例效果图 Marker的更多属性常用属性交互碰撞动画其它属性 折线的更多属性常用属性交互其它属性 多边形的更多属性常用属性交互其它属性 Arc…

【手抖拜拜!特发性震颤患者的专属锻炼秘籍,轻松改善生活品质】

Hey小伙伴们~&#x1f44b; 今天咱们来聊聊一个可能不那么常被提及&#xff0c;但却实实在在影响着很多人生活质量的话题——特发性震颤。如果你或你身边的人正为此困扰&#xff0c;别怕&#xff0c;这篇笔记就是你们的“稳手宝典”&#x1f4da;&#xff01; &#x1f308; 了…

【论文复现】 | 改善抑郁估计从面部对齐,训练优化和调度

文章目录 1、Introduction2、Related work3、 Proposed methodology3.1. Preprocessing and face alignment3.2 Architecture3.3 Data Augmentation3.4 Training 4、Experimental analysis and results4.1 Datasets4.2 Experimental setup4.3 Protocol and Performance metrice…

JS面试题3

1、使用递归完成1~100的累加 // 1~100累加function addRes(x,y){if(x y){return x}else{return y addRes(x,y-1) // 第一次&#xff1a;3 addRes(1,2) > 往后依次递减&#xff0c;到达目标值位置后依次计算累加值}}console.log(addRes(1,3))// 斐波那契数列(兔子数列) &…

【HTML5+JavaScript+CSS3】3D空间环绕旋转特效(效果+源码+可理解的注释)

失去一个人,只是生命中的一段过程,天空不会永远都下雨,我们总会在最深的绝望里,看见最美的风景。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3] 2022年度博客之星人…

案例研究|JumpServer堡垒机为金山办公信息安全保驾护航

金山办公&#xff08;KINGSOFT OFFICE&#xff09;是中国办公软件的领航者&#xff0c;其产品体系以旗舰产品WPS Office为核心&#xff0c;辅以金山文档、金山协作及金山词霸等产品&#xff0c;形成了全方位、高效能的办公生态系统&#xff0c;在中国乃至全球范围内拥有庞大的用…

项目问题 | CentOS 7停止维护导致yum失效的解决办法

目录 centos停止维护意味着yum相关源伴随失效。 报错&#xff1a; 解决方案&#xff1a;将图中四个文件替换掉/etc/yum.repos.d/目录下同名文件 资源提交在博客头部&#xff0c;博客结尾也提供文件源码内容 CentOS-Base.repo CentOS-SCLo-scl.repo CentOS-SCLo-scl-rh.rep…

云计算实训30——自动化运维(ansible)

自动化运维 ansible----自动化运维工具 特点&#xff1a; 部署简单&#xff0c;使用ssh管理 管理端与被管理端不需要启动服务 配置简单、功能强大&#xff0c;扩展性强 一、ansible环境搭建 准备四台机器 安装步骤 mo服务器&#xff1a; #下载epel [rootmo ~]# yum -y i…

mysql数据库连接时区设置UTC的坑?serverTimezone=UTC是什么意思?

Mysql数据库连接&#xff0c;设置时区为UTC的坑&#xff1a; UTC是世界统一时间&#xff0c;也就是世界协调时间&#xff08;UTC&#xff09;/格林尼治时间。比北京时间快8小时。 导致的问题&#xff1a;数据库连接时区设置为UTC之后&#xff0c;数据库里面的数据和系统里面的时…

计算机毕业设计PyHive+PySpark深圳共享单车预测系统 共享单车数据分析可视化大屏 共享单车爬虫 共享单车数据仓库 机器学习 深度学习 Hadoop

题目&#xff1a; 基于hadoop的共享单车布局规划 1. 论文选题的意义 共享单车是一个近年来很热门的新兴事物&#xff0c; 共享经济在我国发展迅速&#xff0c;收到了政府和广大民众的重大关注&#xff0c;而出现的很多问题也引起了众多学者的注意&#xff0c;关于共享单车的研…