ASP.NET 上傳文件安全檢測方案

一、前端初步過濾(防誤操作)

<!-- HTML部分 --><input type="file" id="fileUpload" accept=".jpg,.png,.pdf,.docx" /><button onclick="validateFile()">上傳</button><script>functionvalidateFile(){const file = document.getElementById('fileUpload').files[0];if (!file) return alert('請選擇文件');// 檢查文件擴展名const allowedExtensions = /(\.jpg|\.png|\.pdf|\.docx)$/i;if (!allowedExtensions.test(file.name)){ alert('不允許的文件類型'); return false; }// 檢查文件大小(示例:限制20MB)if (file.size > 20 * 1024 * 1024){ alert('文件超過20MB'); return false; }// 提交表單document.getElementById('uploadForm').submit();}</script>

二、后端深度驗證(核心防御)

// 1. 驗證文件擴展名(雙重驗證,防止繞過前端)

// 2. 驗證MIME類型(檢查Content-Type頭)

// 3. 驗證文件內容(魔數檢測)

// 4. 掃描文件是否包含惡意代碼(示例:檢查HTML文件中的腳本標簽)

// 5. 保存文件到安全位置(禁用執行權限)

// ASP.NET MVC控制器示例[HttpPost][ValidateAntiForgeryToken]public ActionResult Upload(HttpPostedFileBase file){if (file == null || file.ContentLength == 0)return Json(new { success = false, message = "請選擇文件" });try{// 1. 驗證文件擴展名(雙重驗證,防止繞過前端)var allowedExtensions = new[] { ".jpg", ".png", ".pdf", ".docx" };var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant();if (!allowedExtensions.Contains(fileExtension))return Json(new { success = false, message = "文件類型不允許" });// 2. 驗證MIME類型(檢查Content-Type頭)if (!IsValidMimeType(file.ContentType, fileExtension))return Json(new { success = false, message = "文件類型不匹配" });// 3. 驗證文件內容(魔數檢測)if (!IsValidFileContent(file.InputStream, fileExtension))return Json(new { success = false, message = "文件內容異常" });// 4. 掃描文件是否包含惡意代碼(示例:檢查HTML文件中的腳本標簽)if (fileExtension == ".html" && ContainsMaliciousCode(file.InputStream))return Json(new { success = false, message = "文件包含惡意代碼" });// 5. 保存文件到安全位置(禁用執行權限)var fileName = Guid.NewGuid().ToString() + fileExtension;var filePath = Path.Combine(Server.MapPath("~/Uploads/"), fileName);file.SaveAs(filePath);return Json(new { success = true, message = "上傳成功" });}catch (Exception ex){// 記錄詳細日志(包含文件名、大小、時間戳等)Logger.Error($"文件上傳失敗: {ex.Message}", ex);return Json(new { success = false, message = "上傳過程中發生錯誤" });}}// 驗證MIME類型private bool IsValidMimeType(string contentType, string fileExtension){var allowedMimeTypes = new Dictionary<string, string[]>{{ ".jpg", new[] { "image/jpeg", "image/pjpeg" } },{ ".png", new[] { "image/png" } },{ ".pdf", new[] { "application/pdf" } },{ ".docx", new[] { "application/vnd.openxmlformats-officedocument.wordprocessingml.document" } }};if (!allowedMimeTypes.ContainsKey(fileExtension))return false;return allowedMimeTypes[fileExtension].Contains(contentType);}// 驗證文件內容(魔數檢測)private bool IsValidFileContent(Stream stream, string fileExtension){// 重置流位置stream.Position = 0;// 讀取文件前幾個字節(魔數)var buffer = new byte[8];stream.Read(buffer, 0, buffer.Length);stream.Position = 0; // 重置流位置供后續使用// 根據文件類型檢查魔數switch (fileExtension){case ".jpg":// JPEG魔數: FF D8 FFreturn buffer[0] == 0xFF && buffer[1] == 0xD8 && buffer[2] == 0xFF;case ".png":// PNG魔數: 89 50 4E 47 0D 0A 1A 0Areturn buffer[0] == 0x89 && buffer[1] == 0x50 && buffer[2] == 0x4E && buffer[3] == 0x47 && buffer[4] == 0x0D && buffer[5] == 0x0A && ??????????????????buffer[6] == 0x1A && buffer[7] == 0x0A; ???case ".pdf":// PDF魔數: 25 50 44 46return buffer[0] == 0x25 && buffer[1] == 0x50 && buffer[2] == 0x44 && buffer[3] == 0x46;default:// 其他類型可以添加更多檢查return true;}}// 檢查文件是否包含惡意代碼(示例:HTML文件)private bool ContainsMaliciousCode(Stream stream){using (var reader = new StreamReader(stream)){var content = reader.ReadToEnd();stream.Position = 0; // 重置流位置// 檢測常見的惡意代碼模式//在這里增加被攻擊的惡意代碼var maliciousPatterns = new[] {@"<script\s*[^>]*>",@"vbscript:",@"onerror\s*=",@"<iframe\s*[^>]*>"};return maliciousPatterns.Any(pattern =>Regex.IsMatch(content, pattern, RegexOptions.IgnoreCase));}}@"<?xml", // XML注入@"<!DOCTYPE", // XXE攻擊@"<script", // 腳本注入@"<img", // 圖片標簽注入@"<iframe", // iframe注入@"<object", // object標簽@"<embed", // embed標簽@"<applet", // applet標簽@"<form", // form標簽@"<input", // input標簽@"<link", // link標簽@"<style", // style標簽@"<svg", // SVG注入@"<math", // MathML注入@"onerror", // 事件處理器@"onload", // 事件處理器@"javascript:", // JS協議@"data:text/html", // data協議@"base64,", // base64編碼@"eval(", // eval函數@"expression(", // CSS表達式@"alert(", // alert函數@"document.cookie", // 訪問cookie@"window.location", // 重定向@"window.open", // 彈窗@"fetch(", // fetch API@"XMLHttpRequest", // AJAX@"ActiveXObject", // ActiveX@"<meta", // meta標簽@"<body", // body標簽@"<head", // head標簽@"<title", // title標簽@"<audio", // audio標簽@"<video", // video標簽@"<source", // source標簽@"<track", // track標簽@"<marquee", // marquee標簽@"<blink", // blink標簽@"<bgsound", // bgsound標簽@"<frame", // frame標簽@"<frameset", // frameset標簽@"<noscript", // noscript標簽@"<plaintext", // plaintext標簽@"<xss", // xss標簽@"vbscript:", // vbscript協議@"mocha:", // mocha協議@"livescript:", // livescript協議@"<!--", // 注釋@"-->", // 注釋@"<%=", // ASP/模板注入@"<?php", // PHP代碼// @"<%!", // JSP/模板注入@"<%#", // ASP.NET模板注入@"<%$", // ASP.NET模板注入@"<%:", // ASP.NET模板注入@"<%?", // 模板注入@"<%--", // 注釋@"<%>", // 模板@"<c:", // JSTL標簽@"<jsp:", // JSP標簽@"<s:", // Struts標簽// @"<%@", // 指令// @"<#", // Freemarker@"#include", // SSI@"system(", // 系統命令@"exec(", // 系統命令@"passthru(", // 系統命令@"shell_exec(", // 系統命令@"popen(", // 系統命令@"proc_open(", // 系統命令@"require", // PHP@"include", // PHP@"require_once", // PHP@"include_once", // PHP@"import", // Python/JS// @"from", // Python@"os.system", // Python@"subprocess", // Python@"rm -rf", // Linux命令@"del ", // Windows命令@"request",@"eval",@"cmd"

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93306.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93306.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93306.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Nacos Server 3.0.x安裝教程

前言 注&#xff1a; 1.Nacos Server 3.0.x 要求 JDK版本不低于17。 2.Nacos 2.2.0 及以上版本需要 Java 11 或更高版本。 3.Java 8&#xff0c;需要下載 Nacos 2.1.x 及以下版本 JDK17安裝 JDK官方下載地址&#xff1a;Oracle官網JDK下載地址 JDK17&#xff1a;JDK17下載地…

【數據庫干貨】六大范式速記

1NF、2NF、3NF、BCNF、4NF、5NF都是數據庫設計中的范式&#xff08;Normalization&#xff09;&#xff0c;用于確保數據庫中的數據結構盡可能地減少冗余&#xff0c;避免更新異常、插入異常、刪除異常等問題&#xff0c;從而提高數據的存儲效率和一致性。 本篇文章簡單講解下各…

Java開發主流框架搭配詳解及學習路線指南

文章目錄一、前言&#x1f517;二、主流Java框架搭配2.1 Spring Boot MyBatis-Plus Spring Cloud2.2 Spring Boot Spring Data JPA Spring Cloud2.3 Quarkus/Vert.x (響應式編程棧)三、技術選型建議四、Java學習路線指南階段1&#xff1a;Java基礎 (4-6周)階段2&#xff1a…

flutter-使用device_info_plus獲取手機設備信息完整指南

文章目錄1. 概述2. 安裝與配置3. 基本使用方法3.1. 創建實例3.2. 區分平臺獲取信息4. 詳細信息獲取4.1. Android 設備信息4.2. iOS 設備信息4.3. Web 瀏覽器信息4.4. Windows 設備信息5. 實戰示例6. 注意事項6.1. 權限問題6.2. 隱私保護6.3. 平臺差異處理6.4. 性能考慮7. 常見問…

Java 時間處理 API 全解析:從 JDK7 到 JDK8 的演進

個人主頁-愛因斯晨 友友們&#xff0c;互三咯~ 目錄 個人主頁-愛因斯晨 ?編輯 前言 一、JDK7 時間處理基石 ——Date 類 &#xff08;一&#xff09;Date 類基本功能 &#xff08;二&#xff09;Date 類的局限性 二、格式化時間好幫手 ——SimpleDateFormat 類 &#…

duiLib 實現鼠標拖動標題欄時,窗口跟著拖動

1、布局文件&#xff0c;窗口需設置可拖動的標題欄區域&#xff1a;2、HandleMessage函數中&#xff0c;處理WM_LBUTTONDOWN消息&#xff0c;判斷鼠標在標題欄&#xff0c;讓系統處理窗口移動。代碼片段如下&#xff1a;else if (uMsg WM_LBUTTONDOWN) {// 獲取鼠標點擊坐標PO…

圖解嵌入式硬件知識庫體系

構建一個嵌入式硬件知識庫體系需要涵蓋嵌入式系統設計、開發和應用的各個方面,內容全面且系統化,適合不同層次的用戶。本文是一個結構化的嵌入式硬件知識庫體系,包含主要內容模塊及其詳細說明。 @startmindmap * 嵌入式硬件知識庫體系 ** 1. 嵌入式系統基礎 *** 概述與定義 …

機器學習的特征工程(特征構造、特征選擇、特征轉換和特征提取)詳解

特征工程是機器學習中至關重要的一步&#xff0c;它直接影響模型的性能和泛化能力。特征構造、特征選擇、特征轉換和特征提取——構成了特征工程的核心流程。下面我來系統地梳理一下它們的定義、方法和應用場景&#xff1a; 整理 by Moshow鄭鍇https://zhengkai.blog.csdn.net/…

Force Dimension觸覺力反饋設備在外科手術機器人遙操作和訓練中的應用

觸覺力反饋設備通過傳感器-執行器-信號處理閉環系統&#xff0c;在外科手術機器人領域實現了從遠程手術操作到虛擬訓練的全流程革新。外科手術機器人外科醫生廣博的專業知識往往受限于他們的主要工具——手。機器人的精確度和靈活性遠遠超過人手。然而&#xff0c;目前機器人還…

【網絡與爬蟲 00】試讀

網絡爬蟲技術全棧指南&#xff1a;從入門到AI時代的數據采集革命 關鍵詞&#xff1a;網絡爬蟲、Python爬蟲、數據采集、反爬技術、分布式爬蟲、AI爬蟲、Scrapy框架、自動化數據提取、爬蟲架構設計 摘要&#xff1a;本專欄是最全面的網絡爬蟲技術指南&#xff0c;涵蓋從基礎框架…

[Chat-LangChain] 前端用戶界面 | 核心交互組件 | 會話流管理

鏈接&#xff1a;https://python.langchain.com/docs/tutorials/qa_chat_history/ Chat-LangChain技術棧 : LangChainLangGraphNext.jsWeaviate (向量存儲)OpenAI (嵌入模型) docs&#xff1a;chat-langchain Chat LangChain 是一個智能聊天機器人&#xff0c;專為解答Lang…

編寫和運行 Playbook

編寫和運行 Playbook Playbook 介紹 adhoc 命令可以作為一次性命令對一組主機運行一項簡單的任務。不過&#xff0c;若要真正發揮Ansible的能力&#xff0c;需要使用功能 playbook。 playbook 是一個文本文件&#xff0c;其中包含由一個或多個按特定順序運行的play組成的列表。…

uniapp手機端video標簽層級過高問題

當我們想以視頻作為背景時&#xff0c;其他dom通過定位顯示在視頻上方&#xff0c;h5頁面上調試發現可以正常使用&#xff0c;效果如下&#xff1a; 當放在手機上看&#xff0c;會發現&#xff0c;僅僅剩一個視頻&#xff0c;本應在視頻上層的元素不見了。 經過一番排查&#x…

【MyBatis批量更新實現】按照list傳入批量更新

學習目標&#xff1a; <update id"updateModelEngineeringSpatialNode" parameterType"com.mxpt.model.manage.domain.ModelEngineeringSpatialNode">update model_engineering_spatial_node<trim prefix"SET" suffixOverrides",&…

VOFA+ 顯示數據、波形

本篇&#xff0c;以最常用的串口通信作展示&#xff0c;示范如何通過VOFA顯示數據波形。 一、VOFA 下載 VOFA 是一款面向嵌入式開發的上位機軟件&#xff0c;專注于硬件數據實時可視化與調試。它通過高效協議&#xff08;如FireWater、JustFloat&#xff09;將原始字節流轉化為…

MySQL 插入數據提示字段超出范圍?一招解決 DECIMAL 類型踩坑

MySQL 插入數據提示字段超出范圍&#xff1f;一招解決 DECIMAL 類型踩坑 在日常數據庫操作中&#xff0c;我們經常會遇到各種字段類型相關的問題。今天就來聊聊一個常見的錯誤&#xff1a;插入數據時提示字段值超出范圍&#xff0c;以實際案例帶你搞懂 MySQL 中 DECIMAL 類型的…

一周學會Matplotlib3 Python 數據可視化-繪制誤差條形圖

鋒哥原創的Matplotlib3 Python數據可視化視頻教程&#xff1a; 2026版 Matplotlib3 Python 數據可視化 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程講解利用python進行數據可視化 科研繪圖-Matplotlib&#xff0c;學習Matplotlib圖形參數基本設置&…

JVM垃圾回收器

垃圾回收算法標記-復制缺點&#xff1a;內存利用率低&#xff0c;有一塊區域無法使用。標記-清除缺點&#xff1a;1. 效率問題 (如果需要標記的對象太多&#xff0c;效率不高)2. 空間問題&#xff08;標記清除后會產生大量不連續的碎片&#xff09;標記-整理分代收集根據對象存…

科研工具的一些注意事項

Origin Origin導入數據之后&#xff0c;可以考慮 [刪除數據連接器…] 導入數據之后&#xff0c;刪除數據連接&#xff0c;這樣當原來的文件移動之后&#xff0c;就不影響origin文件里面的數據。不然就會出現空白數據&#xff1a;當然&#xff0c;沒有數據了也可以加載出來&…

美國服務器環境下Windows容器工作負載智能彈性伸縮

在北美數據中心加速數字化轉型的今天&#xff0c;企業客戶日益重視Windows容器工作負載的智能化管理。本文將深入探討基于Azure Stack HCI&#xff08;混合云基礎設施&#xff09;的彈性伸縮方案如何突破傳統資源調度瓶頸&#xff0c;通過分析指標收集、策略配置、混合云聯動三…