上传文件附件时判断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[0].Tables[0] as Table;
         string text = doc.GetText()+" ";//获取word文档中的文本
         //纯表格可以使用以下方法
         //遍历表格内容
         for (int i = 0; i < table.Rows.Count; i++)
         {
             var cellsindex = table.Rows[i].Cells.Count;
             for (int j = 0; j < cellsindex; j++)
             {
                 TableCell cell = table.Rows[i].Cells[j];
                 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[3-9]\d{9}";
    return Regex.IsMatch(text, pattern);
}

public static bool ContainsIdNumber(string text)
{
    // 中国大陆身份证号正则表达式
    string pattern = @"[1-9]\d{5}(18|19|20)?\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}(\d|[Xx])";
    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的内容,文本、表格、图片

 

总结:尽一切合理努力保护用户个人信息, 并对个人信息进行保护。为防止用户个人信息在意外的、未经授权的情况下泄漏。

压缩包内容校验基本方法同上,先解压缩,再逐文件处理。本文直接判断有敏感词,不让上传,也可以通过正则把信息替换成****后再转存,这里不再展开。

如有专门的更好用的插件请留言告知讨论,避免重复造轮子。

 

posted @ 2024-03-12 11:05  郑州-在路上  阅读(344)  评论(0编辑  收藏  举报