我正在玩我的小PHP项目,我很惊讶我应该如何处理图像处理.据我所知,它是您在服务器中托管图像或让用户提供链接.鉴于我的应用程序是在共享主机站点上,哪一个更好?有什么风险?
用户提供
您需要确保链接有效
您需要检查链接的内容以确认其图像
您需要能够在每次加载时检查图像
您必须构建您的html以检查图像是否仍然可用.
您还必须确认图像的位置是受信任的位置
如果图像不在HTTPS服务器上,那么您可能会导致浏览器出现问题.
自托管形象
您可以确保图像格式正确.
您需要注意GIF漏洞利用等漏洞
您可以使用PHP动态操作图像
您可以检查和验证图像的大小并存储在文件系统或DB上
需要更多带宽
如果图像是动态的,那么它们会导致高CPU
我建议你去自托管图像,或者在另一个数据中心托管图像,例如带有开放API的图像主机.
如果您担心带宽,那么您可以创建一个图像上传系统,在上传时它使用图像主机API将图像发送到外部源,然后将图像ID与post/user/entity一起存储在数据库中.
Stack Overflow使用ImgUr作为图像,SO已经考虑过你的想法并选择在外部存储但在本地上传,ImgUR返回可以存储的数据,例如:
imgur UrTHG bzEkpCdHPL22Hlp 2010-08-14 03:39:23 image/gif false 314 115 4413 0 0 http://imgur.com/UrTHG.gif http://imgur.com/UrTHG http://imgur.com/delete/bzEkpCdHPL22Hlp http://imgur.com/UrTHGs.jpg http://imgur.com/UrTHGl.jpg
这很好,因为像small_square,large_thumbnail等缩略图是预先生成的元数据,如大小,宽度,高度,视图等.
如果您担心CPU使用率和服务器负载,那么您应该回到上面关于外部数据存储的部分.
如果您担心CPU,那么您可以通过GD库操作图像,然后将缓存版本存储在文件系统上,如果需要我可以在一段时间内更新.
另一个指向用户链接图像的向下指针是,当图像是它时,它可以是动态图像和登录用户数据,例如suer正在访问的页面,如果主要原因是当你在Facebook上并且你嵌入了一个实体时作为博客文章,图像被下载并存储在Facebook的CDN上,因此外部资源无法说明IP的内容和位置.
这应该有助于你做出决定.
由于已经有一些关于XSS风险的讨论,我想我会稍微澄清一点.
如果您选择允许用户为您提供图像链接,则必须验证图像而不是内容,因此必须完成此操作的原因是因为我们说用户输入了以下图像位置.
javascript:alert('XSS');
如果您没有使用类似函数htmlentities()
和HTML Purifier
库的PHP进行清理,则在将上述字符串存储在数据库中之后,当用户尝试访问该页面时,它将呈现如下:
因此每次页面呈现时都会显示一个对话框XSS
,称为XSS Atack,atack随后会添加另一个图像"url"/"code",将某些数据(例如SESSION ID)发送到另一个自动转到的网站您的网站并根据该ID收集数据.
如果攻击者输入了以下网址,http://attacker.com/evil.js
则呈现的内容将如此:
由于这是一个图像标记,evil.js
因此不会被处理为javascript,因为这不是文档对象模型的构建方式,这对用户来说是安全的.
关于漏洞的链接
CSRF
XSS示例
XSS Wiki
Windows图元文件漏洞
跨区脚本