2017-10-17 145 views
15

我创建一个ASP.Net窗体与文件上传控件,然后将电子邮件的形式和文件的详细信息到另一个管理员。我想确保这个安全(对于服务器和收件人)。附件应该是简历,因此我将其限制为典型的文本文档。使ASP.Net文件上传安全

从我能告诉我们最好的选择是检查文件扩展名或MIME类型是否属于这种类型,并根据“幻数”检查它以验证扩展没有被更改。我并不太在意如何去做这件事,但想知道这是否足够。

我也很乐意使用第三方产品,注意到了这一问题,我已经看了一对夫妇:

blueimp jQuery的文件上传 http://blueimp.github.io/jQuery-File-Upload/

和cutesoft 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; 
    } 
} 
+0

_“当文件作为附件添加但未保存时,我是否需要担心服务器安全?”不确定你的意思?什么是“保存”?对于过程的哪一部分“安全”?如果条件不满足,你是否试图从'''.files'属性中移除文件对象? – guest271314

+0

@ guest271314用户正在上传文件,并将其作为附件添加到随后发送的电子邮件中。据我所知这不会导致文件被保存在服务器上,我猜它最终会在邮件服务器上。收件人可能会保存它,但我的意思是它没有保存在服务器上。 – wunth

+0

_“收件人可能会保存它,但我的意思是它没有保存在服务器上。”_您对所描述的过程有什么担忧? – guest271314

回答

3

的服务器可以永远是100%安全的,但我们应该尽最大努力减少事故风险。在这一点上我应该说我不是专家,我只是一名计算机科学专业的学生。所以,在这种情况下,我会采用一种方法。请评论您可以提供的任何额外提示。


一般来说,为了有一个安全的形式,所有的客户端输入必须检查和验证。任何来自我们系统的信息都不可信。从我们的情况下,客户

输入:

  • 文件的名称
    • 扩展
  • 文件的内容

分机

我们并不真正关心minetype,这是一个Web服务器的信息。我们关心文件扩展名,因为这是操作系统关于如何运行/读取/打开文件的指示器。我们必须只支持特定的文件扩展名(你的管理员的电脑可以处理的),没有支持未知文件类型的点。

名称(不包括扩展名)

文件的名称并不总是有价值的信息。当我处理文件上传时,我通常将其重命名为(设置)一个id(用户名,时间戳,哈希等)。如果名字很重要,如果你只希望字母或数字删除所有其他字符(我避免留下“/”,“\”,“。”,因为它们可以用于注入路径),请检查/修剪它。

所以现在我们假设生成的文件名是安全的。

内容

当你上不支持结构化的文件,你就无法验证该文件的内容。因此,让一个专家程序为您做这个......用防病毒扫描它们。从控制台调用防病毒软件(小心使用避免注入的机制)。许多杀毒软件也可以扫描压缩文件内容(恶意文件,在服务器上的文件夹中不是个好主意)。始终保持扫描程序更新。


关于我建议压缩文件的评论,以避免在管理员的机器和服务器上自动执行。管理员的机器防病毒可以在解压缩之前处理它。

还有一些小窍门,不要给客户提供比他需要的更多信息......不要让客户知道文件保存在哪里,不要让网络服务器访问它们以便分发无需。保持日志与奇怪的行动(斜杠在文件名,太大的文件,太长的名称,像“sh”“EXE”“蝙蝠”)警告扩展),并报告管理员的电子邮件,如果有什么奇怪的事情发生(很好知道你的保护工作)。

所有这些都会创建服务器工作负载(更多的系统漏洞),因此您应该计算在接受新的文件上载请求之前扫描/检查的文件数(这是我要发起DDoS攻击的位置)。

快速谷歌搜索Avast! For Linux - Command Line Guide,我不宣传Avast,我只是把它作为一个现有的例子。

最后但并非最不重要的一点,你不是偏执狂,我管理一个自定义翻译系统,我编码...垃圾邮件和黑客攻击已经发生了不止一次。


还有一些想法,运行在网页上的JavaScript只对客户端计算机安全(这要归功于浏览器的安全性)。我们可以使用它来防止向服务器发送无效帖子,但这并不能确保这样的请求不会被完成,因为JavaScript可以被绕过/编辑。因此,所有的JavaScript解决方案仅用于第一次验证(通常只是为了帮助用户更正错误)并正确设置表单数据。