getimagesize 是PHP处理图片的函数,它的主要作用是获取图片的相关信息,如果你对这个函数不使用不是很清楚,请点击getimagesize
为什么会注意到这个函数?
要做一个检查远程CDN图片是否有效的功能,发现这个 getimagesize 函数,不仅可以打开本地的图片,还可以打开远程的图片。
但在实际使用中,发现 getimagesize 在打开远程图片的效率非常低! 通过 getimagesize 检查图片的方式非常 影响性能。 因为它 需要下载图片再检查,故不符合我们预期。遂改成,通过CURL请求 图片地址,通过检测HTTP返回状态的方式来判断。
function curl($url){
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL, $url );
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
$output = curl_exec($ch);
if($output === FALSE ){ return false; }
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE) curl_close($ch);
return $http_code === 200;
}
上面这样就简化了流程,起到了优化的作用。移除了我不需要的下载图片和打开图片的过程,只在HTTP协议层就完成检查的功能。
技能提升
功能做完了,就停止了,那就永远就停留在业务层无法提高
getimagesize 这个函数,对于图片处理上面不仅效率低,而且还存在风险
getimagesize 是通过获取图片数据流中头部几个字节来判断图片类型的
这样就为web_shell注入 提供了机会,木马程序只需要在头部插入相关图片类型几个字节,就可以绕过 getimagesize 的检测。
攻击案例:文件上传漏洞-getimagesize检测
原理: getimagesize 函数不是完全可靠的
解决办法
这里根据业务调整就好,仁者见仁智者见智。 主要是要知道怎么造成的这个漏洞。才知道如何避免。