上傳文件附件時判斷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的內容,文本、表格、圖片

 

總結:盡一切合理努力保護用戶個人信息, 並對個人信息進行保護。爲防止用戶個人信息在意外的、未經授權的情況下泄漏。

壓縮包內容校驗基本方法同上,先解壓縮,再逐文件處理。本文直接判斷有敏感詞,不讓上傳,也可以通過正則把信息替換成****後再轉存,這裏不再展開。

如有專門的更好用的插件請留言告知討論,避免重複造輪子。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章