0

0

C# 文件上传MIME嗅探 C#如何防止因错误的Content-Type导致的安全问题

月夜之吻

月夜之吻

发布时间:2026-03-11 09:26:03

|

297人浏览过

|

来源于php中文网

原创

content-type 不可信,必须通过文件头(magic bytes)进行 mime 嗅探校验;推荐用 filetypedetective 等库读前 512 字节判断真实类型,并在中间件层拦截不匹配或高危类型,结合业务白名单与后续内容分析实现安全上传。

c# 文件上传mime嗅探 c#如何防止因错误的content-type导致的安全问题

Content-Type 为什么不能信

浏览器发来的 Content-Type 是客户端自填的,跟文件真实类型毫无关系。用户改个后缀、用 curl 手动构造请求、甚至拖拽一个 .exe 到上传框,multipart/form-data 里照样能写 Content-Type: image/png。C# 后端如果只靠这个判断文件类型,等于把门禁卡交给陌生人自己刷。

必须做 MIME 嗅探(但别用 FileExtensionContentTypeProvider)

FileExtensionContentTypeProvider 只查扩展名,完全不看文件内容,对绕过毫无防御力。真要防伪装,得读文件头(magic bytes)。

  • 推荐用 Microsoft.AspNetCore.WebUtilities.FileBufferingReadStream 配合 System.IO.BinaryReader 读前几百字节
  • 或轻量级库如 FileTypeDetective(NuGet 可搜),它内置常见格式签名表,比手写 switch 更可靠
  • 注意:不要全文件读取再判断——大文件会吃内存,嗅探只需前 512 字节足够

ASP.NET Core 中间件拦截伪造 Content-Type 的实操点

Startup.ConfigureProgram.cs 的管道里加一层校验逻辑,比在 Controller 里做更早、更统一。

皮卡智能
皮卡智能

AI驱动高效视觉设计平台

下载
  • context.Request.Form.Files 拿到 IFormFile 实例后,立刻调 file.OpenReadStream()
  • Stream.ReadAsync(buffer, 0, 512) 读头部,传给 MIME 检测函数
  • 若检测出的 MIME 类型和 file.ContentType 不匹配,且不在白名单内(比如允许 image/* 但实际是 application/x-executable),直接 context.Response.StatusCode = 400 并返回
  • 特别注意:IIS 默认限制单个请求体最大 30MB,若需支持大文件上传,还得同步调大 MaxRequestBodySizerequestLimits.maxAllowedContentLength

常见误判场景和绕过手段

不是所有“看起来像图片”的文件头都安全。攻击者会利用格式兼容性做文章。

  • .jpg 文件开头加 PHP 标签(<?php ... ?>)仍能被 GD 库解析——此时 MIME 嗅探会报 image/jpeg,但服务器执行时可能触发 RCE
  • Office 文档(.docx/.xlsx)本质是 ZIP,头部是 PK\x03\x04,但里面可嵌恶意宏或 HTML 脚本
  • 某些 PDF 嗅探库会把含 JavaScript 的 PDF 识别为 application/pdf,但它可能触发 XSS —— 这时候光靠 MIME 检测不够,得配合后续的内容沙箱或静态分析

真正难的不是识别类型,而是定义“这个类型+这个内容是否允许上传”。边界永远在业务规则里,不在某个库的返回值里。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

182

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

226

2025.12.18

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

441

2024.03.13

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

454

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

183

2023.10.30

vsd文件打开方法
vsd文件打开方法

vsd文件打开方法有使用Microsoft Visio软件、使用Microsoft Visio查看器、转换为其他格式等。想了解更多vsd文件相关内容,可以阅读本专题下面的文章。

510

2023.10.30

iis无法启动怎么解决
iis无法启动怎么解决

解决方法:1、检查IIS服务是否已安装;2、检查依赖服务;3、检查端口冲突;4、检查配置文件和权限;5、重新注册IIS相关组件;6、检查日志文件。本专题提供iis无法启动怎么解决的文章,大家可以免费阅读。

154

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号