javascript - 使 ASP.Net 文件上传安全

标签 javascript asp.net validation file-upload email-attachments

我正在创建一个带有文件上传控件的 ASP.Net 表单,然后它将表单和文件的详细信息通过电子邮件发送给另一个管理员。我想确保此安全(对于服务器和收件人)。附件应为简历,因此我将其限制为典型的文本文档。

据我所知,最好的办法是检查文件扩展名或 MIME 类型是否属于那种类型,并根据“魔数(Magic Number)”检查它以验证扩展名没有被更改。我不太关心如何去做,但想知道这是否真的足够。

我也很乐意使用第三方产品来解决这个问题,我看过几个:

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

和cutesoft ajaxuploader http://ajaxuploader.com/Demo/

但 blueimp 似乎仍然需要自定义服务器验证(我猜它只是处理客户端验证的 jQuery)而 .net 会检查 MIME 类型是否与扩展名匹配,但我认为 MIME 类型无论如何都遵循扩展名.

所以,

当文件添加为附件但未保存时,是否需要担心服务器安全? 是否有插件或控件可以很好地处理这个问题? 如果我需要为服务器验证实现一些东西,我自己是否将 MIME 类型与“魔数(Magic Number)”相匹配?

我敢肯定没有什么是 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;
    }
}

最佳答案

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


一般来说,要获得安全的表单,必须检查和验证所有客户输入。任何不是来 self 们系统的信息都是不可信的。

在我们的案例中来自客户的输入:

  • 文件名
    • 姓名
    • 分机
  • 文件内容

扩展

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

姓名(不带扩展名)

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

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

内容

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


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

一些提示,不要向客户提供超出他需要的信息...不要让客户知道文件保存在哪里,如果没有,不要让网络服务器访问它们进行分发需要。记录奇怪的操作(文件名中的斜线、太大的文件、太长的名称、警告扩展名,如“sh”、“exe”、“bat”),如果发生任何奇怪的事情,请通过电子邮件报告管理员(最好知道是否你的保护工作)。

所有这些都会增加服务器工作负载(更多系统漏洞),因此您可能应该在接受新的文件上传请求之前计算此时扫描/检查的文件数量(这是我发起 DDoS 攻击的地方) .

通过快速谷歌搜索 Avast! For Linux - Command Line Guide ,我不推广 Avast,我只是将其作为现有示例展示。

最后但同样重要的是,你不是偏执狂,我管理着一个我编写的自定义翻译系统......垃圾邮件和黑客攻击不止一次发生。


更多想法,在网页上运行的 JavaScript 仅对客户端计算机是安全的(由于浏览器的安全性)。我们可以使用它来防止向服务器发送无效帖子,但这并不能确保不会完成此类请求,因为可以绕过/编辑 JavaScript。

因此,所有的 JavaScript 解决方案都只是为了第一次验证(通常只是为了帮助用户纠正错误)和正确设置表单数据。

关于javascript - 使 ASP.Net 文件上传安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46781503/

相关文章:

javascript - 如何创建带圆 Angular 的图表?

asp.net - .NET编译错误,显示用户友好屏幕

ASP.NET调试问题

validation - Grails 为命令对象定义自定义错误消息

javascript - Graphael 饼图错误?

javascript - 使用 jquery load 动态加载页面

javascript - 如何将嵌入式 Youtube 播放器静音?

asp.net - System.EntryPointNotFoundException MVC5

javascript - 使用正则表达式验证 URL 是否安全?

ruby-on-rails - 从validates_uniqueness_of中删除属性(Rails 2)