17

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

感谢您的任何建议。

4

4 回答 4

14

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

也许吧,但这本身并没有真正的帮助。您可以轻松制作既是有效图像格式包含活动 HTML/脚本内容的文件,以便 IE 内容嗅探偶然发现。或者还有需要担心的损坏的 Java 和 Flash 源策略,这可能会产生与将脚本写入服务器安全上下文相同的效果。

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

  2. 如果你不能这样做,作为所有内容注入问题的缓解措施,最好的办法是从不同的 [子] 域提供图像,该域无权访问任何敏感凭据(cookie、基本身份验证)的主站点。

  3. 如果为此目的使用子域,例如images.example.com,您的主站点应该只能通过www.example.com不能 example.com访问。否则,注入的内容images.example.com可以访问example.comIE 中的 cookie。example.com通常应该 301-redirect 以www.example.com防止不必要的 cookie 泄漏。

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

还:

  1. 清理用户指定的文件名很难,特别是如果您的应用程序可能运行在 Windows 服务器上,而有关可用文件名的规则确实很复杂。一个好的开始是只允许字母数字,并添加您自己的文件扩展名和前缀。(需要前缀以避免 Windows 保留文件名和空文件名。)

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

有关文件上传安全问题的更多讨论,请参阅问题。

于 2010-04-07T22:14:35.827 回答
5

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

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

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

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

文件名或路径的外部控制当您在构建文件名时使用外部人员的输入时,生成的路径可能指向预期目录之外。攻击者可以组合多个“..”或类似的序列以使操作系统导航出受限目录。其他与文件相关的攻击通过文件名的外部控制来简化,例如符号链接跟踪,这会导致您的应用程序读取或修改攻击者无法直接访问的文件。如果您的程序以提升的权限运行并且它接受文件名作为输入,则同样适用。类似的规则适用于 URL,并允许外部人员指定任意 URL。

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

于 2010-04-07T21:18:16.377 回答
0

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

https://uploadcare.com

如果您对上传的图像应用任何图像操作,它会被修改,因此可能嵌入文件中的任何代码都将被破坏。

于 2014-12-04T22:10:20.207 回答