【发布时间】:2017-10-24 17:09:43
【问题描述】:
当从多个单独的网页和控制器上传文件时,我的 C# 后端会在名称中包含 HTML 实体的文件被上传时中断:
An exception of type 'System.Web.HttpRequestValidationException' occurred in System.Web.Mvc.dll but was not handled in user code
Additional information: A potentially dangerous Request.Files value was detected from the client (filename="...for_files_#US2023103...").
请注意名称中的 HTML 实体 #,它应该只是 #。我可以浏览每个网页的 JS 并强制 JS 在客户端更改/解码 HTML 实体(很多小的更改),或者我可以更改服务器端代码来处理这个问题,但我不确定服务器端方法可以在不将服务器暴露于漏洞的情况下完成。
为了防止这是一个固执己见的问题,我明确要求:
有没有什么方法可以在服务器端转义/验证文件名,而不抛出异常,也不会使服务器暴露于漏洞?
这是我试图用来替换文件名的代码:
if (requestContext.HttpContext.Request.Files.Count > 0)
{
foreach (HttpPostedFileBase file in requestContext.HttpContext.Request.Files)
{
file.FileName = System.Net.WebUtility.HtmlDecode(file.FileName);
}
}
这当然是不允许的,因为 FileName 是HttpPostedFileBase 的只读属性。我认为检查文件名可能很聪明,如果它有 HTML 实体或分号,然后用更正的名称实例化一个新的 HttpPostedFileBase 对象。
【问题讨论】:
-
请向我们展示引发异常的代码
-
刚刚结束线程标题,您应该始终在服务器端执行数据清理,即使您在客户端上有或没有它。你不能相信客户会做你期望它做的事情。服务器是数据存储或发布给该用户或其他用户之前的最后一道防线。
-
@JacobIRR Wndrr 的回答解决了您的问题?随意接受他的回答
标签: javascript c# jquery asp.net-mvc