我知道,我知道,标题很糟糕,但我会试着解释一下我的意思.所以,我要求我的会员展示他们的照片.他们将它上传到某处,然后将他们照片的URL粘贴到输入中,然后将其保存到我的数据库(MYSQL).然后,他们的个人资料上会看到照片.我从数据库的URL,做这样的事情:">
这里$photo
是从MYSQL采取URL.它完全安全吗?有人可以上传例如.php文件并损坏我的网站吗?我是否需要检查URL的结尾是否为.gif,.png,.jpg?
谢谢.
编辑:是的,当然我会保护我的网站免受SQL注入和XSS攻击.但有没有办法以其他方式伤害我的网站?
不,它根本不安全,可以通过图像标签执行XSS攻击.
一个简单的例子是:
http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29
您所描述的内容可能容易受到XSS(跨站点脚本)攻击.从本质上讲,一个邪恶的用户可能能够注入可能做坏事的javascript代码,同时作为你的网站执行.
有关此攻击媒介的示例,请查看:http://jarlsberg.appspot.com/part2#2__stored_xss_via_html_attribute
编辑:听起来你已经在保护自己的SQL注入和XSS,你想知道是否有某种方法可以让某人将PHP代码注入你的网站.我不认为这是可能的,因为您的服务器端代码不会执行此字符串.您只是指示客户端浏览器从URL下载图像.
某人可能会链接到受病毒感染的图像文件,然后该图像文件会感染您网站的其他访问者,但这不会影响网站本身.
你应该考虑的一件事 - 我可以将你的"XUltra highres"图像与大约200兆的链接联系起来.我想这可能会破坏您网站的加载体验(取决于设计).因此,除了"脚本攻击"之外,用户将内容链接到您的网站始终存在问题.
要做的一件事就是验证它是一个接受格式的真实图像(tpyically jpg,png和gif),并清理和更改文件名.
您可以使用PHP getimagesize函数来检查它是否是有效图片以及格式.您在上传文件时收到所谓的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,并且名称不得包含<>''""# - ,这些字符在合法图像URL中很少出现.