允许将外部图像附加到博客或任何 Web 内容是否安全?

信息安全 Web应用程序 php 攻击预防 上传文件 安全编码
2021-08-23 20:06:16

我正在过滤附加到我博客的任何内容的所有图像:

  1. 检查文件扩展名。
  2. 使用检查内容类型 $finfo = finfo_open(FILEINFO_MIME_TYPE);
  3. 我还将图像临时保存在我的服务器上并检查大小,getimagesize()然后如果函数未返回 false,则将其删除。

但是在这些检查之后,我不会重新检查图像。

我发生什么事了

在一个用户配置文件上,每次访问用户配置文件时,我都可以在图像上看到我的 IP 地址。这是我附在这篇文章中的一个例子:

在此处输入图像描述

现在,我可以得出结论,允许用户附加任何图像都是危险的,因为这种伪装文件攻击可以在每个请求上生成动态图像。

有什么机制可以防止这种情况发生吗?

或者我应该从用户个人资料中删除所有附加图像并将每个图像保存在我的服务器上

3个回答

如果它只是一张简单的个人资料图片,您可以通过使用像Gravatar(这是 security.se 使用的)这样的受信任的第三方来避免大多数安全威胁。使用链接图像作为“ Web Bug ”对于远程图像是不可避免的,但显然很多人并不关心 Gravatar 可以跟踪它们。在本地存储攻击者控制的文件会产生其他安全威胁。

更一般地说,您不想在服务器上存储用户控制的文件。利用此类漏洞的一个很好的例子是使用PHP 本地文件包含 (LFI) 漏洞来获取远程代码执行即使临时存储攻击者控制的文件也是一种安全威胁,可以通过 LFI 攻击加以利用。

使用 getimagesize() 验证链接实际上是图像有助于防止 CSRF。但是,即使是有效的图像文件也可以在 EXIF 元数据中包含 PHP 标记,这可能会被用于 LFI 攻击。可以使用 PHP 的open_base_dir配置选项来防止此类 LFI 攻击,以防止 PHP 在图像或临时目录中包含文件。

当外部图像“附加”到评论时,会发生以下两种情况之一,具体取决于您的服务器处理此类事情的方式:

  • 指向图像的 URL 的引用被保留,并在 HTML 文件中复制,该文件返回给访问您网站的任何客户端浏览器。
  • 图像由您的服务器下载,客户端将收到您保存在服务器上的副本。

在第一种情况下,每个访问您页面的客户端都会自动下载图像,而另一端的服务器(不是您的,包含图像的服务器)可以提供任何它认为合适的图像,这可能取决于当前询问的人(这就是“显示我的 IP”图片的工作原理)。即使您自己使用浏览器浏览该页面,您也无法确定其他所有访问者都会看到相同的内容。此外,包含图像的服务器上的系统管理员将能够为您站点的每个访问者收集 IP 地址。

最后但并非最不重要的一点是,恶意制作的“图像”链接可能指向图像以外的东西,并且不情愿地将您网站的所有访问者纳入分布式拒绝服务

因此,在服务器上获取图片副本并仅从您的服务器将其提供给访问者似乎更安全。这应该与验证/转换步骤相结合,该步骤检查图像是否可以被解码,并强制它具有“合理”的大小。当心SVG等可编写脚本的图像格式

他们不仅可以告诉您的 IP,还可以猜测您正在运行哪种浏览器以及将您发送到那里的网站(引荐标头)。

是的,控制图像隐私的唯一方法是将这些图像托管在您控制其隐私政策的服务器上,在您的情况下,这包括将图像复制到您的服务器。