Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 文件上载安全问题_C#_Asp.net_Security_File Upload - Fatal编程技术网

C# 文件上载安全问题

C# 文件上载安全问题,c#,asp.net,security,file-upload,C#,Asp.net,Security,File Upload,我有一个web表单可供公众使用,它具有文件上传功能。现在,文件要么保存在web服务器上,要么作为附件发送到电子邮件中。我们对上传文件的大小有限制,即15MB和扩展名。我们的SMTP服务器位于同一个web服务器上。我担心安全问题,因为任何人都可能上传恶意文件,并可能对我们的生产web服务器造成影响 公众可以使用这样的文件上传控制会有什么风险?是否有人可以通过上传恶意文件在web服务器上执行恶意脚本 我做了一些研究,发现了以下几点 如果我在电子邮件中以附件的形式发送了一个文件,该文件将临时存储在AS

我有一个web表单可供公众使用,它具有文件上传功能。现在,文件要么保存在web服务器上,要么作为附件发送到电子邮件中。我们对上传文件的大小有限制,即15MB和扩展名。我们的SMTP服务器位于同一个web服务器上。我担心安全问题,因为任何人都可能上传恶意文件,并可能对我们的生产web服务器造成影响

公众可以使用这样的文件上传控制会有什么风险?是否有人可以通过上传恶意文件在web服务器上执行恶意脚本

我做了一些研究,发现了以下几点

  • 如果我在电子邮件中以附件的形式发送了一个文件,该文件将临时存储在ASP.Net临时文件夹中,一旦发送电子邮件,该文件将被删除
  • 在将文件保存到文件系统之前,可以重命名文件
  • 您可以将文件保存在不同的位置作为您的网站
  • 你可以进行某种实时病毒检查。我不知道你怎么能做到。我在读一些命令行病毒扫描。但我不确定我是否真的需要它

  • 这些只是几点,但我想知道文件上传中的盲点。

    要回答您关于可能的安全漏洞的问题,是的,即使您不将文件保存到磁盘,您也可以在应用程序和用户中创建漏洞。但是有一些防线可以用来验证

    第一个是明显地限制可以上传的文件类型,您可以通过一个白名单和检查扩展名来做到这一点,但不要到此为止。您还应该通过查看文件的内容来验证,以确保它符合预期的格式。这可能是至关重要的,因为坏人可以将文件头插入上传的文件,并将您的系统用作僵尸来传播他的恶意软件

    其次,您应该对上载的文件运行病毒扫描,您可以通过使用命令行执行本地病毒扫描程序来执行此操作。这对于包括趋势科技(Trend Micro)在内的许多病毒扫描来说都是一件容易的事情,除非你看到大量的文件上传,否则这对你的服务器来说应该不会是一个巨大的负担

    确保绝不将路径作为用户提交的数据传递(通过GET或POST下载),因为这可能会使您遭受路径遍历攻击。如果您的用户需要从浏览器下载文件,您可以创建存储记录的数据库,然后创建一个控制器或页面,该控制器或页面将根据数据库记录和用户对该记录的访问来获取该文件,而不是提供一个用户可以控制并用于从服务器获取文件的路径

    确保web服务器不可读您要保存到的目录,这样他们就不会上载恶意软件脚本,然后通过HTTP从浏览器执行它

    确保根据某些反XSS库验证所有用户输入(Microsoft提供一个)


    希望有帮助

    最好的方法是将它们上载到/App_Data文件夹,或者将它们作为二进制对象存储在数据库中。App_数据无法通过web服务器读取,因此这将保护您免受执行和脚本访问。以二进制形式存储它们的另一种方法是对它们进行base64编码并以文本形式存储(同样,也可以存储在文件系统App_数据或数据库中)

    创建代理页面以检查用户是否有权查看/下载文件,如果有,则向HTTP响应发送文件流。这样,用户就没有直接访问权限,无法执行任何他们不应该执行的操作。您还可以使用来自流引用的SMTP类附加文件

    如果存储在文件系统中,您可以实现自己的命名约定,以便将实际文件的请求映射到存储的版本


    病毒扫描可能很有用,但可以将其视为保护可能有权下载文件的其他用户,而不是保护您的服务器。

    实际上,如果您将其作为附件发送,它永远不会触及您的磁盘。我甚至不打算尝试回答,我通常会因为不建议采取保密措施而获得支持。气密性没有任何特点。也就是说,如果将无效的web.config或格式不正确的web.config放入上载文件夹,则可以阻止任何.net代码执行。您需要确保阻止所有映射到服务器上执行的内容的扩展,包括.php、.axd、.ashx等。请注意,您的表单不会成为垃圾邮件发送者最喜欢的玩具。限制它可以发送给多少人以及发送的频率,此外还要防范文件风险。@SLaks:我在读某个地方,这取决于您的RequestLength DiskThreshold设置httpruntime。如果文件大小超过requestLengthDiskThreshold,它可能会将文件缓冲到asp.net临时文件夹中。此外,对于任何与smtp相关的错误,您的附件都可以在inetpub内的一个mailroot文件夹中结束。