乔晓龙 发表于 2024-3-12 14:50:01

上传文件附件时判断word、excel、txt等是否含有敏感词如身份证号,手机号等

上传附件判断word、excel、txt等文档中是否含有敏感词如身份证号,手机号等,其它检测如PDF,图片(OCR)等可以自行扩展。
互联网项目中,展示的数据中不能包含个人信息等敏感信息。判断word中是否包含手机号,word正文中是否包含身份证号等敏感信息,通过正则表达式判断匹配手机号,身份证号,以下做为参考。会出现碰撞错误,碰撞不准确等情况,不在本文范围。
开发语言C#,框架asp.net webform。由于上传文件是做的判断,所以这里是判断数据流HttpPostedFile postedFile中的内容。通过load本地文件,本文不做过多介绍。
一、word校验身份证号,手机号
获取word中内容最初用的是npoi插件,office的插件导入导出以前用的比较多,npoi只获取docx文档文本,npoi获取doc后缀有问题,又找的Spire.Doc。可以都使用后者,笔者只简单测试了doc后缀,其它复杂情况没具体测试。有时间的推荐Spire,因为附件中pdf也是一个大项,刚好有对应的using Spire.Pdf;
using NPOI.XWPF.UserModel;
using Spire.Doc;
using Spire.Doc.Documents;
public class WordToTextConvert
{
   /// <summary>
   /// docx提取成纯文本
   /// </summary>
   /// <param name="file"></param>
   /// <returns></returns>
   public static string ExtractTextFromWord(Stream wordFileStream,string fileExt)
   {
         using (wordFileStream)
         {
             XWPFDocument doc = new XWPFDocument(wordFileStream);

             using (StringWriter writer = new StringWriter())
             {
               string text = "";
               foreach (var para in doc.Paragraphs)
               {
                     text += para.Text+" ";
               }

               foreach (XWPFTable table in doc.Tables)
               {
                     foreach (XWPFTableRow row in table.Rows)
                     {
                         foreach (XWPFTableCell cell in row.GetTableCells())
                         {
                           text += cell.GetText() + " ";
                         }
                     }
                     text += "\r\n";
               }
               return text;
             }
         }
   }
   /// <summary>
   /// doc后缀
   /// </summary>
   /// <param name="wordFileStream"></param>
   /// <param name="fileExt"></param>
   /// <returns></returns>
   public static string ExtractTextFromWordDoc(Stream wordFileStream, string fileExt)
   {
         Spire.Doc.Document doc = new Spire.Doc.Document(wordFileStream);
         Spire.Doc.Table table = doc.Sections.Tables as Table;
         string text = doc.GetText()+" ";//获取word文档中的文本
         //纯表格可以使用以下方法
         //遍历表格内容
         for (int i = 0; i < table.Rows.Count; i++)
         {
             var cellsindex = table.Rows.Cells.Count;
             for (int j = 0; j < cellsindex; j++)
             {
               TableCell cell = table.Rows.Cells;
               foreach (Paragraph paragraph in cell.Paragraphs)
               {
                     text += paragraph.Text+" ";
               }
             }

             text += "\r\n";
         }
         return text;
   }
}二、EXCEL校验校验身份证号,手机号
npoi处理excel时要判断后缀,xls和xlsx使用的类不同
public class ExcelToTextConvert
{
    /// <summary>
    /// 提取成纯文本
    /// </summary>
    /// <param name="file"></param>
    /// <returns></returns>
    public static string ExtractTextFromExcel(Stream excelFileStream,string fileExt)
    {
      using (excelFileStream)
      {
            string text = "";

            IWorkbook workbook=null;
            if (fileExt == "xls")
            {
                workbook = new HSSFWorkbook(excelFileStream);
            }
            if (fileExt == "xlsx")
            {
                workbook = new XSSFWorkbook(excelFileStream);
            }
            ISheet sheet = workbook.GetSheetAt(0);
            if (sheet != null)
            {
                foreach (IRow row in sheet)
                {
                  foreach (ICell cell in row)
                  {
                        switch (cell.CellType)
                        {
                            case CellType.String:
                              text += cell.StringCellValue + " ";
                              break;
                            case CellType.Numeric:
                              text += cell.NumericCellValue + " ";
                              break;
                        }
                  }
                  text += "\r\n";
                }
            }
            return text;
      }
    }
}三、txt校验校验身份证号,手机号
获取文件流的内容,文本文件可以直接读取。方法如下:
if ("txt".Contains(fileExt))
{
    // 确保文件不为null并且有数据
    if (postedFile != null && postedFile.ContentLength > 0)
    {
      using (StreamReader reader = new StreamReader(postedFile.InputStream))
      {
            // 读取文件内容并返回
            string readContent = reader.ReadToEnd();
            bool hasMobile = ContainsMobileNumber(readContent);
            if (hasMobile)
            {
                return "{\"status\": 0, \"msg\": \"内容中不可含有手机号!\"}";
            }
            bool hasId = ContainsIdNumber(readContent);
            if (hasId)
            {
                return "{\"status\": 0, \"msg\": \"内容中不可含有身份证号!\"}";
            }
      }
    }
} 四、正则校验字符串中是否包含身份证号,手机号等
public static bool ContainsMobileNumber(string text)
{
    // 中国大陆手机号码正则表达式
    string pattern = @"1\d{9}";
    return Regex.IsMatch(text, pattern);
}

public static bool ContainsIdNumber(string text)
{
    // 中国大陆身份证号正则表达式
    string pattern = @"\d{5}(18|19|20)?\d{2}(0|1)(0|\d|3)\d{3}(\d|)";
    return Regex.IsMatch(text, pattern);
}五、读取pdf方法,未做项目验证,请自行搜索相关方法
供参考:读取显示PDF需要借助PDF库,国内Spire.PDF可以读取PDF内容,包括文本,图片以及表格,你可以通过NuGet搜索安装
1 using Spire.Pdf;
2 using Spire.Pdf.Texts;
3 using System.IO;
4
5 using System.Text;
6
7 namespace ExtractText
8
9 {
10
11 internal class Program
12
13 {
14
15 static void Main(string[] args)
16
17 {
18
19 //创建一个 PdfDocument 对象
20
21 PdfDocument doc = new PdfDocument();
22 //加载PDF文件
23
24 doc.LoadFromFile("AI数字人.pdf");
25
26 StringBuilder sb = new StringBuilder();
27
28 foreach (PdfPageBase page in doc.Pages)
29
30 {
31
32 //创建一个PdfTextExtractot 对象
33
34 PdfTextExtractor textExtractor = new PdfTextExtractor(page);
35
36 //创建一个 PdfTextExtractOptions 对象
37
38 PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();
39
40 //将 isExtractAllText 设置为true
41
42 extractOptions.IsExtractAllText = true;
43
44 //从页面中提取文本
45
46 sb.AppendLine(textExtractor.ExtractText(extractOptions));
47
48 }
49
50 //将提取的文本写入 TXT 文件
51
52 File.WriteAllText("提取指定页面文本.txt", sb.ToString());
53
54 }
55
56 }
57
58 }
59
60 读取表格内容:
61
62 using Spire.Pdf;
63
64 using Spire.Pdf.Utilities;
65
66 using System.IO;
67
68 using System.Text;
69
70 namespace ExtractTable{
71 class Program
72 {
73 static void Main(string[] args)
74 {
75 //实例化PdfDocument类的对象
76 PdfDocument pdf = new PdfDocument();
77 //加载PDF文档
78 pdf.LoadFromFile("sample.pdf");
79 //创建StringBuilder类的对象
80 StringBuilder builder = new StringBuilder();
81 //实例化PdfTableExtractor类的对象
82 PdfTableExtractor extractor = new PdfTableExtractor(pdf);
83 //声明PdfTable类的表格数组
84 PdfTable[] tableLists;
85 //遍历PDF页面
86 for (int pageIndex = 0; pageIndex < pdf.Pages.Count; pageIndex++)
87 {
88 //从页面提取表格
89 tableLists = extractor.ExtractTable(pageIndex);
90 //判断表格列表是否为空
91 if (tableLists != null && tableLists.Length > 0)
92 {
93 //遍历表格
94 foreach (PdfTable table in tableLists)
95 {
96 //获取表格中的行和列数
97 int row = table.GetRowCount();
98 int column = table.GetColumnCount();
99 //遍历表格行和列
100 for (int i = 0; i < row; i++)
101 {
102 for (int j = 0; j < column; j++)
103 {
104 //获取行和列中的文本
105 string text = table.GetText(i, j);
106 //写入文本到StringBuilder容器
107 builder.Append(text + " ");
108 }
109 builder.Append("\r\n");
110 }
111 }
112 }
113 }
114 //保存提取的表格内容为.txt文档
115 File.WriteAllText("ExtractedTable.txt", builder.ToString());
116 }
117 }
118
119 }读取PDF的内容,文本、表格、图片 
总结:尽一切合理努力保护用户个人信息, 并对个人信息进行保护。为防止用户个人信息在意外的、未经授权的情况下泄漏。
压缩包内容校验基本方法同上,先解压缩,再逐文件处理。本文直接判断有敏感词,不让上传,也可以通过正则把信息替换成****后再转存,这里不再展开。
如有专门的更好用的插件请留言告知讨论,避免重复造轮子。
 
出处:http://www.cnblogs.com/oorz/Q群:NET CORE技术交流(444036561)
微信公众号:“专卓”;因为专业,所以卓越!可扫描左侧二维码关注。本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
来源:https://www.cnblogs.com/oorz/p/18067714
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 上传文件附件时判断word、excel、txt等是否含有敏感词如身份证号,手机号等