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

Joa*_*ann 7 php

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

Rob*_*itt 8

用户提供

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

自托管形象

  • 您可以确保图像格式正确.
  • 您需要注意GIF漏洞利用等漏洞
  • 您可以使用PHP动态操作图像
  • 您可以检查和验证图像的大小并存储在文件系统或DB上
  • 需要更多带宽
  • 如果图像是动态的,那么它们会导致高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>
Run Code Online (Sandbox Code Playgroud)

这很好,因为像small_square,large_thumbnail等缩略图是预先生成的元数据,如大小,宽度,高度,视图等.

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

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

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

这应该有助于你做出决定.


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

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

 &#14;  javascript:alert('XSS');
Run Code Online (Sandbox Code Playgroud)

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

<IMG SRC=" &#14;  javascript:alert('XSS');">
Run Code Online (Sandbox Code Playgroud)

因此每次页面呈现时都会显示一个对话框XSS,称为XSS Atack,atack随后会添加另一个图像"url"/"code",将某些数据(例如SESSION ID)发送到另一个自动转到的网站您的网站并根据该ID收集数据.

如果攻击者输入了以下网址,http://attacker.com/evil.js则呈现的内容将如此:

<IMG SRC="http://attacker.com/evil.js">
Run Code Online (Sandbox Code Playgroud)

由于这是一个图像标记,evil.js因此不会被处理为javascript,因为这不是文档对象模型的构建方式,这对用户来说是安全的.

关于漏洞的链接

  • @Brian:有不止一种可能出错的事情.互联网上有一些我不想看到的照片,他们不会出售尺寸足够大的脑漂白剂. (2认同)