我正在使用fileupload控件创建一个ASP.Net表单,然后将表单和文件的详细信息通过电子邮件发送给另一个管理员。我想确保这个安全(对于服务器和收件人)。附件应该是简历,因此我将其限制为典型的文本文档。
据我所知,最好的办法是检查文件扩展名或MIME类型是否属于那种,并根据“幻数”进行检查,以验证扩展名是否未更改。我并不太关心如何去做,但想知道这是否足够。
我也很乐意使用第三方产品来解决这个问题,我看了几个:
blueimp jQuery文件上传 http://blueimp.github.io/jQuery-File-Upload/
和cutesoft ajaxuploader http://ajaxuploader.com/Demo/
但是blueimp似乎仍然需要自定义服务器验证(我猜只是jQuery它只是处理客户端验证)而.net one检查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;
}
}
答案 0 :(得分:3)
服务器永远不会100%安全,但我们应该尽最大努力将事件风险降至最低。在这一点上我应该说我不是专家,我只是一名计算机科学专业的学生。所以,这种方法在这种情况下我会遵循。请评论您提供的任何其他提示。
一般来说,要拥有安全表单,必须检查并验证所有客户端输入。任何非源自我们系统的信息都不受信任。
在我们的案例中来自客户的输入:
<强>扩展强>
我们并不真正关心我的类型,这是网络服务器的信息。我们关心文件扩展名,因为这是操作系统如何运行/读取/打开文件的指示器。我们必须只支持特定的文件扩展名(管理员的个人电脑可以处理的内容),没有必要支持未知的文件类型。
名称(不含扩展名)
文件的名称并不总是有价值的信息。当我处理文件上传时,我通常将其重命名(设置)为id(用户名,时间戳,哈希等)。如果名称很重要,请始终检查/修剪它,如果您只希望字母或数字删除所有其他字符(我避免离开&#34; /&#34;,&#34; \&#34;,&# 34;。&#34;因为它们可用于注入路径。)
现在我们假设生成的文件名是安全的。
内容强>
如果您不支持结构化文件,则无法验证文件的内容。因此,让专家程序为您执行此操作...使用防病毒软件扫描它们。从控制台调用防病毒软件(仔细,使用避免注入的机制)。许多防病毒软件也可以扫描拉链内容(恶意文件,在服务器上的文件夹中不是一个好主意)。始终保持扫描程序的更新。
在评论中我建议压缩文件,以避免在管理员的计算机和服务器上自动执行。然后管理员的计算机的防病毒软件可以在解压缩之前处理它。
更多提示,不向客户提供比他需要的更多信息...不要让客户知道文件的保存位置,不要让如果不需要,Web服务器访问它们以进行分发。使用奇怪的操作保存日志(文件名中的斜杠,太大的文件,太长的名称,警告扩展名,如&#34; sh&#34;&#34; exe&#34;&#34; bat&#34;)并报告管理员发送电子邮件,如果发生任何奇怪的事情(很高兴知道您的保护是否有效)。
所有这些都会造成服务器工作负载(更多系统漏洞),因此您可能需要计算在接受新文件上载请求之前扫描/检查的文件数(这是我发起DDoS攻击的地方)
通过快速谷歌搜索Avast! For Linux - Command Line Guide,我不会宣传Avast,我只是将其作为现有示例展示。
最后但并非最不重要的是,你不是偏执狂,我管理一个我编码的自定义翻译系统......垃圾邮件和黑客攻击不止一次发生。
更多想法,在网页上运行的JavaScript只对客户端计算机是安全的(由于浏览器的安全性)。我们可以使用它来防止向服务器发布无效帖子,但这并不能确保不会因为JavaScript被绕过/编辑而无法完成此类请求。
因此,所有JavaScript解决方案仅用于第一次验证(通常只是为了帮助用户纠正错误)并正确设置表单数据。