图像上传 - 安全问题

时间:2010-04-07 21:14:41

标签: c# asp.net security image image-uploading

我正在开发一个ASP.NET Web应用程序,并希望用户能够从本地系统上传图像,或者将URL传递给图像。图像可以是JPG或PNG。这样做我应该关注哪些安全问题?我已经看到了在JPG文件中嵌入代码的各种方法。 C#(或外部库)中是否有任何方法可以确认文件是JPG / PNG,否则会抛出错误?至少,我正在制作保存上传图像不可浏览的目录,并将最大大小限制为1mb,但我想进一步检查。

感谢您的任何建议。

4 个答案:

答案 0 :(得分:12)

  

C#(或外部库)中是否有任何方法可以确认文件是JPG / PNG,否则会抛出错误?

也许吧,但这本身并没有多大帮助。您可以轻松地制作既是有效图像格式的文件包含用于IE内容的活动HTML /脚本内容 - 嗅探绊倒。或者需要担心破坏的Java和Flash原始策略,这可能与脚本进入服务器的安全上下文具有相同的效果。

  1. 如果您处理图像(例如裁剪,调整大小)并重新保存,则会使内容走私攻击非常非常困难。但是,您应始终确保服务器端工具是最新的,因为图像处理库中的漏洞可能会使您面临服务器端漏洞利用。

  2. 如果你不能这样做,最好的办法是减轻所有内容注入问题,以便从不能访问任何敏感凭证的不同[子]域提供图像主网站的(cookies,basic auth)。

  3. 如果为此目的使用子域名,例如images.example.com,则您的主网站只能 www.example.com example.com。否则,注入images.example.com的内容可以访问IE中example.com的cookie。 example.com应该301重定向到www.example.com,以防止不必要的Cookie泄漏。

  4. 将标题X-Content-Type-Options: nosniff添加到响应中以阻止来自IE8的内容走私攻击。 (对早期版本没有帮助,唉。)

  5. 此外:

    1. 清理用户指定的文件名 hard ,尤其是如果您的应用可能在Windows服务器上运行,其中有关可用文件名的规则确实很复杂。一个好的起点是只允许使用字母数字,并添加自己的文件扩展名和前缀。 (必须使用前缀来避免Windows保留文件名和空文件名。)

    2. 更好:将用户提供的文件名存储在数据库中,而不是将其用作真实文件名。

    3. 有关文件上传安全问题的更多讨论,请参阅this question

答案 1 :(得分:4)

这是一个绝对的雷区。要考虑的事情(不一定是详尽的清单,没有保证等)。

  • 有些人使用正则表达式进行解析,因此无法知道文件是否包含代码。 ZIP文件最后有他们的目录。 Sun / Oracle Java PlugIn / WebStart现在检查文件是否以ZIP本地标头/条目幻数开头,以避免“GIFAR”攻击。
  • 从不同的域名服务,以避免同源问题。
  • 从不同的IP地址提供服务,以避免同源问题。
  • 检查文件是否正在利用,比如0天的缓冲区溢出,这有点棘手。它甚至可能利用无限循环来创建DoS。
  • 最好重新编码图像。
  • 注意URL /文件路径名。如果您提供选项,请使用白名单检查。特别是NUL字符是“有趣的”。另请参见目录遍历攻击。一般来说,能够放置一个已知位置的文件,至少是一个很大的狡猾。
  • 或者您可能想要检查尺寸是否合理的图像。解压缩巨大的图像很可能导致DoS。另请注意,压缩算法通常允许通过巨大因子来压缩普通数据。

答案 2 :(得分:3)

不要让用户确定将在您的服务器上使用的文件名。如果需要,请使用[generated guid] .jpg并将它们使用的文件名放在数据库表中。

请参见此处的#12:http://www.codinghorror.com/blog/2009/01/top-25-most-dangerous-programming-mistakes.html

  

文件名或路径的外部控制当您使用局外人时   构造文件名时输入,   结果路径可以指向外部   目的目录。攻击者   可以组合多个“..”或类似的   导致操作的序列   系统导航出来的   限制目录。其他   与文件相关的攻击简化了   文件名的外部控制,例如   作为符号链接,其中   导致您的应用程序读取或   修改攻击者无法修复的文件   直接访问。这同样适用于   你的程序正在运行   特权,它接受文件名为   输入。类似的规则适用于URL和   允许局外人指定   任意网址。

也要小心URL,确保它是一个绝对的外部URL,这样他们就无法使用您自己的Web服务器将局域网中的机密文件复制到他们可以访问的区域,因为您将加载来自Web服务器上运行的代码的URL。

答案 3 :(得分:0)

您可以使用基础架构即服务来处理图片,例如我们的解决方案 - Uploadcare:

https://uploadcare.com

如果您将image operations中的任何一个应用于上传的图片,则会对其进行修改,因此可能会破坏文件中嵌入的所有代码。