【发布时间】:2018-03-28 15:14:33
【问题描述】:
我正在创建一个带有文件上传控件的 ASP.Net 表单,然后它将表单和文件的详细信息通过电子邮件发送给另一个管理员。我想确保这个安全(对于服务器和收件人)。附件应该是简历,所以我将其限制为典型的文本文档。
据我所知,最好的办法是检查文件扩展名或 MIME 类型是否属于这种类型,并对照“幻数”检查以验证扩展名是否未更改。我不太关心如何去做,但想知道这是否真的足够。
我也很乐意使用第三方产品来解决这个问题,我看过几个:
blueimp jQuery 文件上传 http://blueimp.github.io/jQuery-File-Upload/
和可爱的 ajaxuploader http://ajaxuploader.com/Demo/
但是 blueimp 一个似乎仍然需要自定义服务器验证(我猜它只是 jQuery,它只处理客户端验证)并且 .net 一个检查 MIME 类型与扩展名匹配,但我认为 MIME 类型无论如何都遵循扩展名.
所以,
当文件作为附件添加但未保存时,我是否需要担心服务器安全? 是否有一个插件或控件可以很好地处理这个问题? 如果我自己需要为服务器验证实现某些东西,是否将 MIME 类型与“幻数”相匹配就足够了?
我确信没有什么是 100% 防弹的,但文件上传是很常见的事情,我认为大多数实现都“足够安全” - 但是如何!?
如果相关,这是我目前的基本代码
<p>Please attach your CV here</p>
<asp:FileUpload ID="fileUploader" runat="server" />
并在提交时
MailMessage message = new MailMessage();
if (fileUploader.HasFile)
{
try
{
if (fileUploader.PostedFile.ContentType == "text")
{
// check magic numbers indicate same content type... if(){}
if (fileUploader.PostedFile.ContentLength < 102400)
{
string fileName = System.IO.Path.GetFileName(fileUploader.PostedFile.FileName);
message.Attachments.Add(new Attachment(fileUploader.PostedFile.InputStream, fileName));
}
else
{
// show a message saying the file is too large
}
}
else
{
// show a message saying the file is not a text based document
}
}
catch (Exception ex)
{
// display ex.Message;
}
}
【问题讨论】:
-
“当文件作为附件添加但未保存时,我是否需要担心服务器安全?” 不明白您的意思?什么是“得救”?关于过程的哪一部分“安全”?如果不满足条件,您是否尝试从
<input type="file">.files属性中删除文件对象? -
@guest271314 用户正在上传文件,并将其作为附件添加到随后发送的电子邮件中。据我所知,这不会导致文件保存在服务器上,我猜它最终会保存在邮件服务器上。收件人可能会保存它,但我的意思是它没有保存在服务器上。
-
“收件人可能会保存它,但我的意思是它没有保存在服务器上。”您对所描述的过程有什么担忧?
-
@guest271314 虽然我很担心有人危言耸听推销东西:acunetix.com/websitesecurity/upload-forms-threat
-
@GramThanos 一开始我真的很喜欢这个想法,但我认为它不能解决嵌入式代码或宏等问题。 - 该文件只会与服务器上的更多交互以压缩它和收件人在解压缩后仍然会得到相同的文件。老实说,我认为我的问题是无知和偏执狂的可怕混合!我的解决方案是采取务实的方法,采取一些合理的措施,并了解我们的基础设施有措施在上游进一步保护自己——我很快就会写出更多细节。聪明的建议,谢谢!
标签: javascript asp.net validation file-upload email-attachments