让用户为其图像提供链接是否安全?

时间:2010-09-14 18:01:38

标签: php

我正在玩我的小PHP项目,我对如何处理图像处理问题感到震惊。据我所知,它是您在服务器中托管图像或让用户提供链接。鉴于我的应用程序是在共享主机站点上,哪一个更好?有什么风险?

6 个答案:

答案 0 :(得分:8)

提供的用户

  • 您需要确保链接有效
  • 您需要检查链接的内容以确认其图像
  • 您需要能够在每次加载时检查图像
  • 你必须构建你的html以检查图像是否仍然可用。
  • 您还必须确认图像的位置是受信任的位置
  • 如果您的图像不在HTTPS服务器上,那么您可能会导致浏览器出现问题。

自托管图片

  • 您可以确保图像的格式正确。
  • 您需要注意GIF Exploit
  • 等漏洞
  • 您可以使用PHP动态
  • 操作图像
  • 您可以检查并验证图像的大小并存储在文件系统或数据库
  • 需要更多带宽
  • 如果图像是动态的,那么它们会导致高CPU

我建议您使用自托管映像,或在其他数据中心托管图像,例如使用开放API的图像主机。

如果您担心带宽,那么您可以创建一个图像上传系统,在上传后它使用图像主机API将图像发送到外部源,然后将图像ID与post / user / entity一起存储在数据库中

Stack Overflow使用ImgUr来显示图像, SO已经考虑过您的想法并选择在外部存储但本地上传,ImgUR返回可以存储的数据,示例如下:

<images>
    <image>
        <name>imgur</name>
        <title/>
        <caption/>
        <hash>UrTHG</hash>
        <deletehash>bzEkpCdHPL22Hlp</deletehash>
        <datetime>2010-08-14 03:39:23</datetime>
        <type>image/gif</type>
        <animated>false</animated>
        <width>314</width>
        <height>115</height>
        <size>4413</size>
        <views>0</views>
        <bandwidth>0</bandwidth>
    </image>
    <links>
        <original>http://imgur.com/UrTHG.gif</original>
        <imgur_page>http://imgur.com/UrTHG</imgur_page>
        <delete_page>http://imgur.com/delete/bzEkpCdHPL22Hlp</delete_page>
        <small_square>http://imgur.com/UrTHGs.jpg</small_square>
        <large_thumbnail>http://imgur.com/UrTHGl.jpg</large_thumbnail>
    </links>
</images>

这很好,因为像small_square,large_thumbnail等缩略图会与大小,宽度,高度,视图等元数据一起预先生成。

如果您担心CPU使用率和服务器负载,那么您应该回到上面关于外部数据存储的部分。

如果您担心CPU,那么您可以通过GD库操作图像,然后将缓存版本存储在文件系统上,如果需要我可以间隔更新。

另一个指向用户链接图像的向下指针是,当图像是它时,它可以是动态图像和登录用户数据,例如suer正在访问的页面,这个是主要原因,当你在Facebook上和你嵌入时像博客文章这样的实体,图像被下载并存储在Facebook的CDN上,因此外部来源无法说明IP的内容和位置。

这可以帮助你做出决定。


由于已经有一些关于XSS风险的讨论,我想我会稍微澄清一点。

如果您选择允许用户为您提供图像链接,则必须验证图像而不是内容,因此必须完成此操作的原因是让用户输入以下图像位置。

 &#14;  javascript:alert('XSS');

如果您没有使用htmlentities()HTML Purifier库等函数通过PHP进行清理,则在将上述字符串存储到数据库中后,当用户尝试访问该页面时,它将呈现如下:

<IMG SRC=" &#14;  javascript:alert('XSS');">

因此每次页面呈现时都会显示一个说明XSS的对话框,称为XSS Atack,atack然后会添加另一个图像“url”/“code”来发送某些数据,例如SESSION ID到另一个站点,该站点自动进入您的站点并以该ID收集数据。

如果攻击者输入了以下网址http://attacker.com/evil.js,那么呈现的内容就是这样:

<IMG SRC="http://attacker.com/evil.js">

由于这是一个图片代码,因此evil.js不会被视为javascript,因为这不是文档对象模型的构建方式,这对用户来说是安全的。

漏洞链接

答案 1 :(得分:3)

如果您接受来自用户的网址并使用它们构建<img>标记,则需要注意一点:您必须小心不要受到Cross Site Scripting(XSS)攻击,这是一种攻击,恶意用户可以将自己的代码注入您的网站。

例如,假设你的代码如下:

$img_url_from_user = $_POST['image_url']; // user inputs a URL in a form
echo '<img src="' . $img_url_from_user . '" />';

恶意用户来到您的表单并填写:

Malicious attack - user enters invalid.jpg" onerror="alert('attack!') as the image URL

现在当PHP获取该输入并将其用于上面的$img_url_from_user时,浏览器得到的HTML就是

<img src="invalid.jpg" onerror="alert('attack!')" />

当页面加载时,您将看到一个警报(显然,攻击者可以做得更糟。例如,他们可以收集cookie,然后使用AJAX调用将信息发送到他们自己的服务器)。因此,您必须确保清理用户提供的任何输入!

<强>资源

答案 2 :(得分:0)

依赖于应用程序链接的一个风险是,如果链接死亡,图像就会死亡。将服务保留在服务器上的一个风险是,可以将任何内容伪装成图像文件。

答案 3 :(得分:0)

我强烈建议您将图像请求推送到imgur.com,因为它似乎是一个非常可靠的图像主机,它会在一段时间内重新出现,以帮助支持Reddit.com对图片托管的需求。 Imgur将允许您链接到他们托管的图像,他们是完全免费的。它们不像是印刷品或其他会在以后阻止您的图像的网站。

我能看到的唯一缺点是,如果有人在使用同时拥有大量免费色情内容的网站时遇到问题。如果你想去那里,完全是你的电话。这是一扇敞开的门,任何人都可以上传任何东西......但它稳定可靠,所以我用它来满足我所有的图像托管需求。

答案 4 :(得分:0)

使用外部图片网址的另一个问题是(除非在网址指向的服务器上禁用热链接),否则您可能会导致其他人的带宽问题,因为大多数用户都不会费心将图片上传到免费图片托管如果图像已经存在于互联网的某个地方,则自己站点。

答案 5 :(得分:0)

每当您在页面上显示用户创建的内容时,您都需要将其视为具有放射性。这是一个潜在的XSS漏洞。请查看this cheat-sheet的示例。一些可能会危害用户的示例输入:

  • document.write('Gotcha!')
  • http://myserver.com/coolimage.png" onload="document.write('Gotcha!')
  • ><a href=malicioussite.com>View user profile</a>