当允许用户通过URL上传图片时,我应该注意什么?

3

我正在开发一个用户可以发布笔记的网站。我考虑允许用户通过提供图像的URL(而不是通过表单上传)来发布图像。

然而,我了解到这可能会被用于某些黑客行为,例如,用户可以粘贴一个不是图像的URL,因此当页面加载时,将会向该URL发出GET请求。
我想知道:
1. 还有哪些恶意行为可能发生,以及如何阻止它们?
2. 是否有一种简单的方法(只使用JavaScript)来检查URL是否为图像?

2个回答

6
当允许用户上传任意文件到服务器时(这就是这个问题),有很多问题需要关注。
首先,您需要确保文件是图像,并且只能作为图像访问(即不能作为脚本执行)。
其次,图像不能太大或者对用户或服务器造成DoS攻击。
第三,您需要确保以安全的方式保存图像,使用户无法覆盖敏感文件。
第四,从与主要内容不同的来源提供所有上传的内容。这不仅更安全,而且可能更快(没有cookies)。
第五,请确保使用ImageMagick或GD处理图像,以删除图像中的任何不需要的数据。请记住,图像文件可以用作包含除可见数据之外的其他数据的容器。
第六,注意路径注入、 LFI 、RFI等攻击。
第七,不要依赖扩展名来告诉您图像是什么类型的文件。请自行检查。

然而,我发现这可以用于某种类型的黑客攻击,例如,用户可以粘贴一个不是图像的url,因此当页面加载时,将对该url进行GET请求。

用户会粘贴指向图像的链接还是上传自己电脑上的文件?

  1. 还有哪些黑客攻击可能利用这个漏洞?

我们这样说吧:用户正在向您的服务器上传任意文件

  1. 有没有一种简单的方法(只需使用JavaScript)来检查url是否为图像?

实际上没有,而且这也没有帮助。您需要进行服务器端检查。

您需要阅读的内容列表:

http://www.scriptygoddess.com/archives/2004/10/19/gifs-that-execute-a-php-script/

有更多的问题...


请参考http://www.thinkfu.com/blog/gifjavascript-polyglots,这是一个违反“只能作为图像访问(即不能作为脚本执行)”规则的例子。 - Mike Samuel
不要在不受信任的输入上使用ImageMagick。浏览器的图像解码器已经针对缓冲区溢出和各种其他漏洞进行了加固,比ImageMagick更加安全。您可以通过chroot监禁和syscall沙盒化或以降低权限的虚拟化方式来减轻风险。我没有GD的经验,因此无法评论其针对不受信任的图像加固的程度。 - Mike Samuel
Re DOSing。有可能出现一些能够DOS浏览器并且是有效的图像,而且能够快速通过网络传输。例如,一个包含自己onload脚本的SVG图像可以拒绝服务。 - Mike Samuel

0

如果在HTML中嵌入一个未知的URL作为图像,则无论它是否真正是图像,都会执行对此URL的GET请求。

问题是这可能会造成一些损害,例如:

  • 向图像服务器揭示当前正在查看该图片及其所嵌入页面的信息(如果不将图像复制到您的服务器上,则无法避免此情况)
  • 以当前查看者的用户身份(他可能已在该服务器上登录,并且不会自愿执行此类操作)在图像服务器上运行脚本,根据查看者的情况执行不同操作(并对查看者产生潜在间接伤害)。您可以通过代理访问或将图像复制到您的服务器上来避免这种情况。)
  • 或被用户的浏览器误解为脚本或其他有害内容,导致页面外观发生奇怪的变化,甚至更加恶意的事情。我认为这就是大多数浏览器通过跨站点访问策略来保护的内容。 如果您将图像复制到您的服务器上,则情况可能会更糟。

通过您自己的服务器代理它可以确保请求不会发送任何凭据(如cookie),从而使XSRF失效。代理还有助于解决混合内容问题。但是,您说得对,通过相同的源代理它会带来一系列问题。因此,在代理内容时,您需要使用一个与存储敏感数据或其内容受信任的页面不共享的域。 - Mike Samuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接