需要做的几件事情是验证它是一个被接受格式(通常为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获取图像,保存到临时文件中,然后像上面描述的那样检查它是否真的是一个图像。这也可以捕捉到用户链接到不存在或无效的图像,所以你可以警告他们。此外,强制实施文件大小/尺寸限制——你不希望某个人在他们的个人资料中链接到一个5GB的图片(虽然这将是他们自己的带宽问题),因为这可能会影响你的其他用户。不过,用户随时都可以更改文件为其他内容。你可以每隔x小时检查一次,并警告那些正在进行可疑操作的人,但这似乎需要你付出很多努力。
你还可以强制执行文件名规则,比如文件名中不能有unicode,名称不能包含<>''""# -这些字符,在合法的图像URL中很少出现。
<img src="<?=htmlspecialchars($photo);?>" height="123px" width="123px">">
。这个代码没有保护XSRF(跨站请求伪造)的安全问题,如果用户输入/logout.php
作为图片URI很可能会造成问题。 - Frank Farmer