上傳文件附件時判斷word、excel、txt等是否含有敏感詞如身份證號,手機號等

来源:https://www.cnblogs.com/oorz/p/18067714
-Advertisement-
Play Games

上傳附件判斷word、excel、txt等文檔中是否含有敏感詞如身份證號,手機號等,其它檢測如PDF,圖片(OCR)等可以自行擴展。 互聯網項目中,展示的數據中不能包含個人信息等敏感信息。判斷word中是否包含手機號,word正文中是否包含身份證號等敏感信息,通過正則表達式判斷匹配手機號,身份證號, ...


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

 

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

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

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

 

作者:鄭州 - 在路上 出處:http://www.cnblogs.com/oorz/

Q群:NET CORE技術交流(444036561)NET CORE技術交流

微信公眾號:“專卓”;因為專業,所以卓越!可掃描左側二維碼關註。 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要介紹了設計模式中的狀態模式,然後在這個基礎上介紹了Spring狀態機相關的概念,並根據常見的訂單流轉場景,介紹了Spring狀態機的使用方式。 ...
  • F-String(格式化字元串字面值)是在Python 3.6中引入的,它是一種非常強大且靈活的字元串格式化方法。 它允許你在字元串中嵌入表達式,這些表達式在運行時會被求值並轉換為字元串,這種特性使得F-String在編寫Python代碼時能夠更簡潔、更直觀地處理字元串。 本文總結了5個實用的F-S ...
  • 概述:在WPF中,通過使用不同的元素如Ellipse、Line、Rectangle等,可以輕鬆繪製各種圖形,包括圓、線條、橢圓、矩形、多邊形等。同時,通過TextBlock展示文字,Image展示圖片,以及Path創建路徑和曲線,使得圖形的繪製變得靈活多樣。通過簡單的XAML代碼,開發者可以快速構建 ...
  • 程式能運行,就是告訴你RZ10012,然後各種提示沒有了。 清理解決方案、電腦重啟了都沒有用,後來搜索到github,解決了,記一下: 關閉vs 刪除文件夾 .vs,bin,object 打開vs,重新生成解決方案 也是醉了。 文字少的博文不允許投稿到該網站分類? 知道什麼叫短小精悍嗎?知道什麼叫短 ...
  • 11.1.0-beta1 Avalonia 是 dotnet 的跨平臺 UI 框架,提供靈活的樣式系統,支持 Windows、macOS、Linux、iOS、Android 和 WebAssembly 等多種平臺。 Avalonia 已經成熟並已做好生產準備,已被 Schneider Electri ...
  • System.Diagnostics.DiagnosticSource 可以豐富地記錄程式中地日誌,包括不可序列化的類型(例如 HttpResponseMessage 或 HttpContext)。 System.Diagnostics.DiagnosticSource 通過訂閱發佈模式運行,我們可 ...
  • 開源項目地址:https://gitee.com/lowcodexaf/rules-engine-editor 前言 本項目是基於XAFBlazor的規則引擎編輯器,規則引擎採用的是微軟開源的RulesEngine RulesEngine項目地址:https://github.com/microso ...
  • 開閉原則(Open-Closed Principle, OCP)是面向對象設計的五大SOLID原則之一。這個原則主張“軟體實體(類、模塊、函數等)應該對擴展開放,對修改關閉”。也就是說,軟體的設計應該允許在不修改原有代碼的情況下增加新的功能。這樣的設計有助於降低代碼的複雜性和維護成本,同時提高系統的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...