可以通过img src发生“坏”事吗?

时间:2010-06-24 22:15:32

标签: php mysql html

我知道,我知道,标题非常糟糕,但我会试着解释一下我的意思。所以,我要求我的会员展示他们的照片。他们将它上传到某处,然后将他们照片的URL粘贴到输入中,然后将其保存到我的数据库(MYSQL)。然后,他们的个人资料上会看到照片。我从数据库中获取URL并执行类似的操作:<img src="<?=$photo;?>" height="123px" width="123px">">其中$photo是从MYSQL获取的URL。它完全安全吗?有人可以上传例如.php文件并损坏我的网站吗?我是否需要检查URL的结尾是否为.gif,.png,.jpg?
谢谢。

编辑:是的,当然我会保护我的网站免受SQL注入和XSS攻击。但有没有办法以其他方式伤害我的网站?

12 个答案:

答案 0 :(得分:12)

不,它根本不安全,XSS攻击可以通过图像标签执行。

一个简单的例子是:

<IMG SRC=j&#X41vascript:alert('test2')>

http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29

答案 1 :(得分:12)

您所描述的内容可能容易受到XSS(跨站点脚本)攻击。从本质上讲,一个邪恶的用户可能会注入可能做坏事的javascript代码,同时作为你的网站执行。

有关此攻击媒介的示例,请查看:http://jarlsberg.appspot.com/part2#2__stored_xss_via_html_attribute

编辑:听起来你已经在保护自己的SQL注入和XSS了,你想知道是否有某种方法可以让某人将PHP代码注入你的网站。我不认为这是可能的,因为您的服务器端代码不会执行此字符串。您只是指示客户端浏览器从URL下载图像。

某人可能会链接到感染了病毒的图像文件,然后会感染您网站的其他访问者,但这不会影响网站本身。

答案 2 :(得分:5)

你应该考虑的一件事 - 我可以将你的“XUltra highres”图像与大约200兆的链接联系起来。我想这可能会破坏您网站的加载体验(取决于设计)。 因此,除了“脚本攻击”之外,用户将内容链接到您的网站始终存在问题。

答案 3 :(得分:5)

要做的一件事是验证它是一个可接受格式的真实图像(tpyically jpg,png和gif),并清理并更改文件名。

您可以使用PHP getimagesize function检查它是否是有效图片以及格式。您在上传文件时收到所谓的MIME类型,但这对验证毫无用处。因此,以下应该可以工作,因为getimagesize函数也验证图像并返回exif类型。

$image_info=getimagesize($tempname);

$allowed_types=array(IMAGETYPE_PNG,IMAGETYPE_JPEG,IMAGETYPE_GIF);//these are actually the integers 1, 2 and 3

if(in_array($image_info[2],$allowed_types)){
   //image is a valid image. You can also check the height and width.
   }

在您的上传处理中,为您的文件提供一个您选择的新唯一名称是一个好主意,然后您不必担心他们会对文件名做任何奇怪的事情。

编辑: 我注意到您指的是向图像提供URL的用户。

我给出的答案与接受,存储和显示用户上传到您服务器的图像有关。

但是,相同的原则适用于显示图像的URL。您可以通过cURL或fopen获取图像,将其保存到临时文件,然后检查它是否真的是如上所述的图像。这也可以捕获用户链接到不存在或无效的图像,因此您可以警告它们。此外,强制执行文件大小/维度限制 - 您不希望有人链接到其配置文件中的5 GB图片(尽管这将是他们自己的带宽问题),因为这可能会给您的其他用户带来不便。但是,用户可以随后将文件更改为其他内容。你可以每隔x小时检查一次,并警告正在做可疑事情的人,但这似乎是你需要付出很多努力。

您还可以强制执行文件名规则,例如文件名中没有unicode,并且名称不得包含&lt;&gt;''“#”,这些字符很少出现在合法图片网址中。

答案 4 :(得分:2)

假设您已经为SQL注入进行了清理。您需要阻止用户执行以下操作:

<img src="http://usmilitary/launchAllNukes?When=Now" />

或:

<img src""<script>//Evil code</script>" height="123px" width="123px" />

答案 5 :(得分:2)

在插入数据库之前,使用imagemagick验证照片是真实的图像,而不是其他东西,你应该没问题。

答案 6 :(得分:2)

如果您允许用户将任何URL指定为配置文件图像,则攻击者可以利用该URL来促进针对较小网站的拒绝服务攻击。它对目标网站的影响相当于被削减。例如,攻击者可以将他/她的个人资料图片URL更改为目标网站上托管的大型资源。每当访问您网站的访问者看到攻击者的个人资料时,目标网站都会浪费为访问者提供资源的带宽。

解决方法是仅允许链接到图片托管网站的个人资料图片网址。

答案 7 :(得分:2)

严格来说 - 是的。我可以在您的网站上发布由我的服务器托管的图片。

<img alt="Kobi's Photo" src="http://example.com/photo.jpg" />

似乎无辜,但实际上,您网站中的每位访客都可以跟踪和记录您的图像。每个访问者都会在我的服务器中获得一个会话,甚至可以给一个cookie(不是有趣的类型)。更糟糕的是,我可以跟踪显示我的照片的访问者的每个页面视图 - 浏览器通过引用标题发送每张显示照片的网址。
通过让人们托管自己的照片,您可以放弃访客的隐私。

答案 8 :(得分:1)

检查文件扩展名没有意义,因为这并不能保证脚本不会处理它。 GET请求(由img src使用)应该是安全的,并且不应导致重大的状态更改(例如,购买,删除用户等)。但是,有些网站会这样做。

因此,最安全的解决方案是要求用户将图像上传到您的网站。如果您允许远程图像,则至少需要httphttps方案。

答案 9 :(得分:0)

除了其他人所说的关于邪恶意图的话,我能看到的唯一另一个问题是,如果图像真的很恐怖,那么可以在任何可以上传图像的网站上发生。

如果您实际允许用户上传图像,您可以检查mime类型(PHP的getimagesize()函数可以为您提供此信息)。这也不是防弹,但比检查扩展更好。

答案 10 :(得分:0)

通过上传“某处”,您是否会在您的网络服务器上托管文件?

有很多潜在的问题:

<img src="http://hacker.ru/badtimes.php" />
<img src="javascript:alert(String.fromCharCode(88,83,83))" />

另外,特制的jpgs可以感染用户的机器: http://www.microsoft.com/technet/security/bulletin/ms04-028.mspx

答案 11 :(得分:0)

您可以使用正则表达式来过滤PHP中的网址。这样你就可以防止调用javascript标签并指定有效的文件扩展名。