首页 > 其他分享 >.NET 6 实现敏感词过滤

.NET 6 实现敏感词过滤

时间:2023-05-12 22:01:59浏览次数:43  
标签:return string resCode 敏感 过滤 new NET resultStr

原文链接:https://www.cnblogs.com/lucasDC/p/17255906.html

一、什么是敏感词过滤?

敏感词过滤是一种处理网络内容的技术,可以检测和过滤出网络中的敏感/违禁词汇。它通过给定的关键字或字符串,判断网络内容是否包含某些敏感信息,从而防止违反法律法规的信息流通。
通常,可以使用两种方法来过滤敏感词:

  1. 黑名单过滤:即定义一个黑名单,将所有敏感词择记录在其中,然后对输入的文本进行对比,如果发现有敏感词,就将其过滤掉。
  2. 白名单过滤:即定义一个白名单,将所有不敏感的词汇记录在其中,然后对输入的文本进行对比,如果发现有不在白名单中的词汇,就将其过滤掉。

二、ToolGood.Words是什么?

ToolGood.Words是一款高性能非法词(敏感词)检测组件,附带繁体简体互换,支持全角半角互换,获取拼音首字母,获取拼音字母,拼音模糊搜索等功能。
ToolGood.Words的源码网站:ToolGood.Words源码网站

三、在Visual Studio中安装ToolGood.Words

3.1、右键项目解决方案,选择“管理NuGet程序包”,如下图所示:

选择“管理NuGet程序包”

3.2、切换到“浏览”选项卡,搜索“ToolGood.Words”并安装:

安装ToolGood.Words
安装完之后最好重新编译生成项目

四、创建“subContentCheck”类

敏感/违禁词汇因特殊内容不便上传,可自行在网站上查找

using Microsoft.AspNetCore.DataProtection.KeyManagement;
using Microsoft.AspNetCore.Http;
using Microsoft.CodeAnalysis.Text;
using Newtonsoft.Json;
using System.Collections;
using System.Text;
using ToolGood.Words;
using static System.Net.Mime.MediaTypeNames;
using IHostingEnvironment = Microsoft.AspNetCore.Hosting.IHostingEnvironment;

namespace WebApplication1 //放在自己项目中时,需要更换为自己的命名空间
{
    public class keywords
    {
        public List<string> IllegalKeywords { get; set; }
    }

    public class urlwords
    {
        public List<string> IllegalUrls { get; set; }
    }

    /// <summary>
    /// 提交的内容敏感违禁词检查类
    /// </summary>
    public class subContentCheck
    {
        /// <summary>
        /// 本地静态文件地址路径
        /// </summary>
        private IHostingEnvironment _hostingEnv;

        /// <summary>
        /// 敏感词库
        /// </summary>
        private string dictionaryPath = "/sensitiveWords/sensitiveWords.txt";

        /// <summary>
        /// 敏感链接、网站、网址库
        /// </summary>
        private string urlsPath = "/sensitiveWords/IllegalUrls.txt";

        /// <summary>
        /// 保存敏感词组
        /// </summary>
        public string[] Words { get; set; }

        /// <summary>
        /// 一个参数的构造函数
        /// </summary>
        /// <param name="hostingEnv">本地静态文件地址路径</param>
        public subContentCheck(IHostingEnvironment hostingEnv)
        {
            _hostingEnv = hostingEnv;
            InitDictionary();
        }

        /// <summary>
        /// 初始化内存敏感词库
        /// </summary>
        public void InitDictionary()
        {
            Words = new string[] { };
            string wordsPath = _hostingEnv.WebRootPath + dictionaryPath;
            string urlPath = _hostingEnv.WebRootPath + urlsPath;
            //List<keywords> keys = new List<keywords>();
            //List<urlwords> urls = new List<urlwords>();
            string[] readAllWords = System.IO.File.ReadAllLines(wordsPath, System.Text.Encoding.UTF8);
            string[] readAllurl = System.IO.File.ReadAllLines(urlPath, System.Text.Encoding.UTF8);
            //由于数组是非动态的,不能进行动态的添加,所有先将它转成list,操作
            ArrayList arrayList = new ArrayList(Words.ToList());
            if (readAllWords.Length > 0 || readAllurl.Length > 0)
            {
                if (readAllWords.Length > 1)
                {
                    //keywords key = new keywords();
                    //key.IllegalKeywords = new List<string>();
                    foreach (string itemWords in readAllWords)
                    {
                        string[] allSplitWords = itemWords.Split('|');
                        foreach (string itemSplitWords in allSplitWords)
                        {
                            if (!string.IsNullOrEmpty(itemSplitWords))
                            {
                                arrayList.Add(itemSplitWords);
                                //string aaa = itemSplitWords;
                                //key.IllegalKeywords.Add(aaa);
                                //IllegalKeywords.Add(itemSplitWords);
                            }
                        }
                    }
                    //keys.Add(key);
                }
                else
                {
                    if (readAllWords.Length == 1)
                    {
                        string[] allSplitWords = readAllWords[0].Split('|');
                        //keywords key = new keywords();
                        //key.IllegalKeywords = new List<string>();
                        foreach (string itemSplitWords in allSplitWords)
                        {
                            if (!string.IsNullOrEmpty(itemSplitWords))
                            {
                                arrayList.Add(itemSplitWords);
                                //string aaa = itemSplitWords;
                                //key.IllegalKeywords.Add(aaa);
                                //IllegalKeywords.Add(itemSplitWords);
                            }
                        }
                        //keys.Add(key);
                    }
                }

                if (readAllurl.Length > 1)
                {
                    //urlwords url = new urlwords();
                    //url.IllegalUrls = new List<string>();
                    foreach (string itemUrls in readAllurl)
                    {
                        string[] allSplitUrls = itemUrls.Split('|');
                        foreach (string itemSplitUrls in allSplitUrls)
                        {
                            if (!string.IsNullOrEmpty(itemSplitUrls))
                            {
                                arrayList.Add(itemSplitUrls);
                                //string Keyword = itemSplitUrls;
                                //url.IllegalUrls.Add(Keyword);
                                //IllegalUrls.Add(itemSplitUrls);
                            }
                        }
                    }
                    //urls.Add(url);
                }
                else
                {
                    if (readAllurl.Length == 1)
                    {
                        string[] allSplitUrls = readAllurl[0].Split('|');
                        //urlwords url = new urlwords();
                        //url.IllegalUrls = new List<string>();
                        foreach (string itemSplitUrls in allSplitUrls)
                        {
                            if (!string.IsNullOrEmpty(itemSplitUrls))
                            {
                                arrayList.Add(itemSplitUrls);
                                //IllegalUrls.Add(itemSplitUrls);
                                //string Keyword = itemSplitUrls;
                                //url.IllegalUrls.Add(Keyword);
                            }
                        }
                        //urls.Add(url);
                    }
                }
            }
            //我们在将list转换成String[]数组 
            Words = (string[])arrayList.ToArray(typeof(string));
        }

        /// <summary>
        /// 过滤替换敏感词
        /// </summary>
        /// <param name="sourceText">需要过滤替换的原内容</param>
        /// <param name="replaceChar">敏感词替换的字符;默认替换为‘*’</param>
        /// <returns>返回状态码;为空则表示传入的内容为空;“0”:设置违禁词时发生错误;“1”:敏感内容替换时发生错误;“2”:需要替换的文本内容为空;其余则返回替换成功的字符串内容</returns>
        public string FilterWithChar(string sourceText, char replaceChar = '*')
        {
            if (!string.IsNullOrEmpty(sourceText))
            {
                string result = "";
                WordsSearch wordsSearch = new WordsSearch();
                try
                {
                    wordsSearch.SetKeywords(Words);
                }
                catch (Exception ex)
                {
                    result = "0";
                    return result;
                }

                try
                {
                    result = wordsSearch.Replace(sourceText, replaceChar);
                    return result;
                }
                catch (Exception ex)
                {
                    return result = "1";
                }
            }
            else
            {
                return "2";
            }
        }

        /// <summary>
        /// 查找原内容中知否包含敏感/违禁词
        /// </summary>
        /// <param name="sourceText">需要判断的原内容</param>
        /// <returns>返回状态码;为空则表示传入的内容为空;“0”:设置违禁词时发生错误;“1”:敏感内容查询时发生错误;“2”:需要替换的文本内容为空;“3”:原内容中包含敏感/违禁词汇;“4”:原内容中不包含敏感/违禁词汇</returns>
        public string FindSensitiveKey(string sourceText)
        {
            string result = "";
            if (!string.IsNullOrEmpty(sourceText))
            {
                WordsSearch wordsSearch = new WordsSearch();
                try
                {
                    wordsSearch.SetKeywords(Words);
                }
                catch (Exception ex)
                {
                    result = "0";
                    return result;
                }

                try
                {
                    bool res = wordsSearch.ContainsAny(sourceText);
                    if (res)
                    {
                        result = "3";
                        return result;
                    }
                    else
                    {
                        result = "4";
                        return result;
                    }
                }
                catch (Exception ex)
                {
                    return result = "1";
                }
            }
            else
            {
                result = "2";
            }
            return result;
        }

        /// <summary>
        /// 把对象写入到json文件中
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        public static void Write(List<keywords> jsonData, List<urlwords> urlJsonData, string filename)
        {
            var directorypath = Directory.GetCurrentDirectory();
            string strFileName = directorypath + "\\" + filename + ".json";
            string ListJson = "";
            if (jsonData != null)
            {
                ListJson = JsonConvert.SerializeObject(jsonData);
            }
            else
            {
                ListJson = JsonConvert.SerializeObject(urlJsonData);
            }

            Console.WriteLine(ListJson);

            writeJsonFile(strFileName, ListJson);

            //将序列化的json字符串内容写入Json文件,并且保存
            void writeJsonFile(string path, string jsonConents)
            {
                using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, System.IO.FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    //如果json文件中有中文数据,可能会出现乱码的现象,那么需要加上如下代码
                    Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
                    using (StreamWriter sw = new StreamWriter(fs, Encoding.GetEncoding("GB2312")))
                    {
                        sw.WriteLine(jsonConents);
                    }
                }
            }
        }
    }
}

五、写API接口

/// <summary>
/// 进行敏感词脱敏
/// </summary>
/// <param name="sourctText">需要脱敏的文本内容</param>
/// <returns></returns>
[HttpPost]
public IActionResult sensitive_words_replace2(string sourctText)
{
    string resultStr = "";
    //实例化敏感词库
    subContentCheck strCheck = new subContentCheck(_hostingEnv);
    if (string.IsNullOrEmpty(sourctText))
    {
        return Json(new { code = 230, msg = "需要替换的文本内容为空!", resultStr = resultStr });
    }
    try
    {
        resultStr = strCheck.FilterWithChar(sourctText);
        string resMsg = "";
        int resCode = 200;
        if (resultStr=="0")
        {
            resCode = 210;
            resultStr = "";
            resMsg = "设置违禁词时发生错误,请联系管理员!";
        }else if (resultStr=="1")
        {
            resCode = 240;
            resultStr = "";
            resMsg = "敏感内容替换时发生错误!";
        }
        else if (resultStr == "2")
        {
            resCode = 260;
            resultStr = "";
            resMsg = "需要替换的文本内容为空!";
        }
        else
        {
            resCode = 200;
            resMsg = "敏感词替换请求成功!";
        }
        return Json(new { code = resCode, msg = resMsg, resultStr = resultStr });
    }
    catch (Exception ex)
    {
        return Json(new { code = 220, msg = "敏感内容替换时发生错误!", resultStr = "" });
    }
}

/// <summary>
/// 进行敏感词判断
/// </summary>
/// <param name="sourctText">需要脱敏的文本内容</param>
/// <returns></returns>
[HttpPost]
public IActionResult whether_sensitive_words(string sourctText)
{
    string resultStr = "";
    //实例化敏感词库
    subContentCheck strCheck = new subContentCheck(_hostingEnv);
    if (string.IsNullOrEmpty(sourctText))
    {
        return Json(new { code = 230, msg = "需要替换的文本内容为空!", resultStr = resultStr });
    }
    try
    {
        resultStr = strCheck.FindSensitiveKey(sourctText);
        string resMsg = "";
        int resCode = 200;
        if (resultStr == "0")
        {
            resCode = 210;
            resultStr = "";
            resMsg = "设置违禁词时发生错误,请联系管理员!";
        }
        else if (resultStr == "1")
        {
            resCode = 240;
            resultStr = "";
            resMsg = "敏感内容匹配时发生错误!";
        }
        else if (resultStr == "2")
        {
            resCode = 260;
            resultStr = "";
            resMsg = "需要判断的文本内容为空!";
        }
        else if (resultStr == "3")
        {
            resCode = 270;
            resultStr = "";
            resMsg = "内容中含有敏感/违禁词!";
        }
        else
        {
            resCode = 200;
            resMsg = "内容中不含敏感/违禁词!";
        }
        return Json(new { code = resCode, msg = resMsg, resultStr = resultStr });
    }
    catch (Exception ex)
    {
        return Json(new { code = 220, msg = "敏感内容匹配时发生错误!", resultStr = "" });
    }
}

六、前端封装JS方法

/**
 * 敏感词/违禁词替换
 * @param {string} sourctText 需要进行替换的内容
 * @param {string} boxid 将替换成功之后的内容赋值的元素容器id属性名
 * @param {object} layui Layui实例
 * @returns 替换之后的文本内容
 */
function sensitive_words_replace(sourctText, boxid, layui) {
    let resultStr = "";
    //let url = ["/Home/sensitive_words_replace", "/Home/sensitive_words_replace1", "/Home/sensitive_words_replace2"];
    $.ajax({
        url: "/Home/sensitive_words_replace2",//请求后端接口的路径
        dataType: "JSON",
        type: "POST",
        data: {
            "sourctText": sourctText
        },
        success: function (res) {
            let resCode = res.code;
            let resMsg = res.msg;
            if ((resCode == "210" || resCode == 210) || (resCode == 220 || resCode == "220") || (resCode == 230 || resCode == "230") || (resCode == 240 || resCode == "240") || (resCode == 260 || resCode == "260")) {
                //返回数据后关闭loading
                layer.closeAll();
                resultStr = res.resultStr;
                layui.layer.alert(resMsg, { icon: 5, title: "温馨提示", closeBtn: 0 });
            } else if (resCode == 200 || resCode == "200") {
                resultStr = res.resultStr;
                $("#" + boxid).val(resultStr);
                //返回数据后关闭loading
                layer.closeAll();
            }
        },
        error: function (error) {
            //返回数据后关闭loading
            layer.closeAll();
            layui.layer.alert(error, { icon: 5, title: "温馨提示", closeBtn: 0 });
        }
    });
    return resultStr;
}

/**
 * 查询是否包含敏感/违禁词
 * @param {string} sourctText 需要进行替换的内容
 * @param {string} boxid 将替换成功之后的内容赋值的元素容器id属性名
 * @param {object} layui Layui实例
 * @returns 返回Bool;包含:“true”;不包含:“false”
 */
function whether_sensitive_words(sourctText, boxid, layui) {
    let resultBool = false;
    $.ajax({
        url: "/Home/whether_sensitive_words",//请求后端接口的路径
        dataType: "JSON",
        type: "POST",
        async: false,//此处需要注意的是要想获取ajax返回的值这个async属性必须设置成同步的,否则获取不到返回值
        data: {
            "sourctText": sourctText
        },
        success: function (res) {
            let resCode = res.code;
            let resMsg = res.msg;
            if ((resCode == "210" || resCode == 210) || (resCode == 220 || resCode == "220") || (resCode == 230 || resCode == "230") || (resCode == 240 || resCode == "240") || (resCode == 260 || resCode == "260")) {
                resultBool = false;
                layui.layer.alert(resMsg, { icon: 5, title: "温馨提示", closeBtn: 0 });
            } else if (resCode == 270 || resCode == "270") {
                resultBool = true;
            } else if (resCode == 200 || resCode == "200") {
                resultBool = false;
                //返回数据后关闭loading
                layer.closeAll();
            }
        },
        error: function (error) {
            layui.layer.alert(error, { icon: 5, title: "温馨提示", closeBtn: 0 });
        }
    });
    return resultBool;
}
 

标签:return,string,resCode,敏感,过滤,new,NET,resultStr
From: https://www.cnblogs.com/qinweizhi/p/17396382.html

相关文章

  • python推荐系统实现(矩阵分解来协同过滤)|附代码数据
    原文链接:http://tecdat.cn/?p=10911最近我们被客户要求撰写关于推荐系统的研究报告,包括一些图形和统计输出。用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品1.用户和产品的潜在特征我们可以通过为每个用户和每部电影分配属性,然后将它们相乘......
  • 1103.模版变量及模版过滤器
    一、模版路径总结在配置文件setting.py文件中找到TEMPLATES进行文件路径配置:1.DIRS定义一个目录列表,模板引擎按流标顺序搜索这些目录以查询模板源文件。将templates放在主项目目录下:2.APP_DIRS告诉模板引擎是否应该进入每个已安装的应用中查找模板,值为True则模板会去安装了......
  • Chrome 开发者工具 network 标签页里获取到的 cookie 字段在 Postman 里的应用
    在Chrome开发者工具中的Network标签页观察HTTP请求时,其中一个常见的字段就是requestheaders。其中的cookie值是指浏览器向服务器发送的Cookie。Cookie是一种服务器存储在客户端计算机上的小文本文件,可以用于存储用户的身份信息、浏览器的偏好设置等信息。在HTTP请......
  • netty运行测试类时报错:Unrecognized option: --illegal-access=deny
    netty(4.1.42.Final )运行netty-buffer模块测试类时报错:Unrecognizedoption:--illegal-access=deny Unrecognizedoption:--illegal-access=denyError:CouldnotcreatetheJavaVirtualMachine.Error:Afatalexceptionhasoccurred.Programwillexit.解题思路:1、......
  • 什么是 Intelligence Enterprise 的 Business network?
    IntelligenceEnterprise(智能企业)的BusinessNetwork(业务网络)是指企业内部和外部的所有关键业务参与者之间的互动和协作关系。这些参与者包括供应商、客户、合作伙伴、员工等。BusinessNetwork是IntelligenceEnterprise构建数字化生态系统的核心,它可以促进各方之间的信息共......
  • JavaWeb过滤器读取并修改POST请求的参数-YhtHttpServletRequestWrapper
    核心原理就是一个类:javax.servlet.http.HttpServletRequestWrapper一个简单的例子,当任何请求的参数里有aaa的时候,把它的值改成bbb新增一个类自定义的类CustomHttpServletRequestWrapper importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSer......
  • 云原生第三周--kubernetes组件详解
    etcd组件etcd简介:etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现。etcd具有下面这些属性:完全复制:集群中的每个节点都可以使用完整的存档高可用性:Etcd可用于避免......
  • SpringBoot集成Jpa对数据进行排序、分页、条件查询和过滤
    之前介绍了SpringBoot集成Jpa的简单使用,接下来介绍一下使用Jpa连接数据库对数据进行排序、分页、条件查询和过滤操作。首先创建Springboot工程并已经继承JPA依赖,如果不知道可以查看我的另一篇文进行学习,这里不做介绍。文章地址(https://www.cnblogs.com/eternality/p/17391141.html......
  • 布隆过滤器与Redis
    布隆过滤器是一种用来判定某个对象是否存在是否已经添加过的数据结构,一般来说,布隆过滤器要有初始化,加入对象,判定对象是否存在三个功能,本质上来说,与hashmap,hashset的思路是一样的,但是因为面对的场景不一样,在数据结构的设计思路上也有一些变化,一般来说,布隆过滤器面对的是海量数据,而......
  • HTTP Error 500.31 - Failed to load ASP.NET Core runtime
    一、问题:Youmustinstallorupdate.NETtorunthisapplication.App:D:\Projects\four_pl\BaseApi3\EDIGateway\bin\Debug\net5.0\EDIGateway.dllArchitecture:x64Framework:'Microsoft.AspNetCore.App',version'5.0.0'(x64).NETlo......