11

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

通过这种向公众开放的文件上传控制,我将面临哪些风险?是否有人可以通过上传恶意文件在 Web 服务器上执行恶意脚本。

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

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

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

4

2 回答 2

7

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

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

其次,您应该对上传的文件进行病毒扫描,您可以使用命令行执行本地病毒扫描程序来执行此操作。对于包括趋势科技在内的许多病毒扫描来说,这是一件容易的事,除非您正在查看大量文件上传,否则它不应该对您的服务器造成巨大的负担。

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

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

确保针对某些反 XSS 库验证所有用户输入(Microsoft 提供了一个http://www.microsoft.com/en-us/download/details.aspx?id=28589

希望有帮助!

于 2012-10-13T18:00:33.073 回答
4

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

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

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

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

于 2012-10-15T14:10:32.813 回答