asp.net-mvc – 上传图片 – 安全
建立:
我正在编写电子学习包的管理实用程序.使用此实用程序,教师可以编写他们的课程,添加/上传图像等. 我的问题是关于上传文件时的安全漏洞,特别是图像文件. 以下代码是我上传新图像文件的POST的控制器代码: [HttpPost] public virtual ActionResult StepImage(int CourseId,int StepOrder,HttpPostedFileBase file) { service.CourseId = CourseId; service.StepOrder = StepOrder; if (file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); var fileExtension = Path.GetExtension(fileName); if ((fileExtension == ".jpg") || (fileExtension == ".gif") || (fileExtension == ".png")) { service.StoreImageFileName(fileName); var path = Server.MapPath("~/[path to where images are uploaded]/" + service.CourseId + "/"); if(!Directory.Exists(path)) { Directory.CreateDirectory(path); } file.SaveAs(path + fileName); } else { // Refactor notice : Validation for invalid file extension } } else { // Refactor notice : Validation for no file chosen } return RedirectToAction(MVC.Admin.StepEditor.Actions.Edit(CourseId,StepOrder)); } 您可以从上面的代码中看到我检查文件扩展名并且只允许.jpg,.gif和.png. 问题 >我尝试将文件存储在App_Data文件夹下,但是当Views尝试显示图像时,这会导致403禁止响应. 这有安全隐患吗?有人可以上传带有.jpg扩展名的.exe文件并让它执行baddie代码吗? 必须要说的是风险很低,因为只有导师才有权使用上传文件的页面,但你只需要一个心怀不满的导师…或者他们将登录详细信息提供给学生……或者其他. >该代码中的任何其他安全风险? PS: 基础知识来自Scott Hanselman和Phil Haack关于使用ASP.NET MVC 2上传文件主题的博客文章: Phil Haack post Scott Hanselman post 解决方法
将图像放在App_Data文件夹中时会收到403响应,因为IIS会阻止任何浏览器直接访问App_Data中的文件.
将它们放在?/ Images /中,但取决于该文件夹的安全性,这可能意味着任何人都可以列出?/ Images /和/或查看图像的内容.默认情况下,IIS禁止列出任何文件夹的内容,但允许任何人查看图像.因此,如果有人知道图像的文件名,他们就可以查看它们. 解决方案是使用URL based authentication.只有导师(或任何需要的人)才能看到图像. 如果您想完全控制谁在哪些页面上看到了什么,您仍然可以将图像放在App_Data文件夹中,然后将它们流式传输给谁或者任何需要它们的人. 关于将.exe作为jpg上传,这当然是可行的.它甚至适用于任何类型的文件. 但是,您将文件保存到磁盘,不要自己做任何事情.这使得.exe-as-jpg在您的服务器上执行的风险非常小.除非有人在.net代码中发现了强制.net执行jpg的漏洞,否则这是不太可能的. 您还可以在视图中向用户显示jpg.这又带来了安全风险,可能是用户的浏览器有一个漏洞,迫使它在用户的计算机上执行.exe-as-jpg.但是,我认为这种情况仍然不太可能发生(但并非不可能.它已经在例如see this之前完成). 为了防止这种情况,您需要在服务器端检查每个图像以查看它是否真的是图像.然而,这些(可能不存在的)安全风险非常小,即使利用这种风险也需要知道很多计算机和编程的人.就个人而言,我不担心这一点. 绝对安全是不可能的(好吧,没有永远不会打开你的电脑.如果它什么都不做,毕竟什么都不会出错).这一切都取决于你想要多少安全性以及多少时间和安全性.你可以投资的钱. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core – ASP.NET核心DisplayAttribute本地化
- asp.net – ValidationGroup的RequiredFieldValidator不验证
- asp.net – e.CommandArgument for asp按钮不工作
- asp.net – 从页面代码中访问代码隐藏变量
- asp.net – IValidatableObject在DataAnnotations失败时触发
- asp.net – 链接到Microsoft编码标准/最佳实践文档?
- asp.net-mvc – ASP.NET MVC切换语言,如何实现?
- asp.net – 报表查看器控件(Web)显示空白报告
- asp.net – 从Google财经,雅虎金融或交易所获取股票报价
- 在ASP.Net Web应用程序中运行后台任务并获得反馈的最佳方法
- asp.net-mvc – ViewModels和渲染
- asp.net-mvc – ASP.NET MVC4,带有webforms Defa
- asp.net – Asp:CheckBox复选框和文本不在同一行
- asp.net-mvc – 是否有可能在每次验证后使ASP.NE
- 单个ASP.NET UserControl事件的多个订阅者?
- asp.net-mvc – IIS 8 Express不提供页面
- asp.net-mvc – 如何在MVC 5A应用程序中实现OWIN
- asp.net-mvc-3 – MVC脚手架问题
- asp.net – 从Web服务返回XElement
- asp.net-mvc – 带有Expression Web 4的ASP.NET