我可以getimagesize()
用来验证图像,但问题是如果淘气的用户放置一个10GB 随机文件的链接,那么它会破坏我的生产服务器的带宽。如何限制文件大小getimagesize()
?(例如,最大图像大小为 5MB)
PS:我在问之前做了研究。
我可以getimagesize()
用来验证图像,但问题是如果淘气的用户放置一个10GB 随机文件的链接,那么它会破坏我的生产服务器的带宽。如何限制文件大小getimagesize()
?(例如,最大图像大小为 5MB)
PS:我在问之前做了研究。
您不想getimagesize('http://example.com')
一开始就这样做,因为这将下载图像一次,检查大小,然后丢弃下载的图像数据。这确实是对带宽的浪费。
因此,将下载过程与检查图像大小分开。例如,fopen
用来打开图片的URL,一点一点的读,写到一个临时文件,记下你读了多少。一旦超过 5MB 并且仍未完成阅读,您将停止并拒绝该图像。
您可以在开始实际下载之前尝试读取 HTTP Content-Size 标头以清除明显较大的文件,但您不能依赖它,因为它可能被欺骗或省略。
这是一个示例,您需要进行一些更改以满足您的要求。
function getimagesize_limit($url, $limit)
{
global $phpbb_root_path;
$tmpfilename = tempnam($phpbb_root_path . 'store/', unique_id() . '-');
$fp = fopen($url, 'r');
if (!$fp) return false;
$tmpfile = fopen($tmpfilename, 'w');
$size = 0;
while (!feof($fp) && $size<$limit)
{
$content = fread($fp, 8192);
$size += 8192; fwrite($tmpfile, $content);
}
fclose($fp);
fclose($tmpfile);
$is = getimagesize($tmpfilename);
unlink($tmpfilename);
return $is;
}
您可以单独下载文件,设置您希望下载的最大大小:
function mygetimagesize($url, $max_size = -1)
{
// create temporary file to store data from $url
if (false === ($tmpfname = tempnam(sys_get_temp_dir(), uniqid('mgis')))) {
return false;
}
// open input and output
if (false === ($in = fopen($url, 'rb')) || false === ($out = fopen($tmpfname, 'wb'))) {
unlink($tmpfname);
return false;
}
// copy at most $max_size bytes
stream_copy_to_stream($in, $out, $max_size);
// close input and output file
fclose($in); fclose($out);
// retrieve image information
$info = getimagesize($tmpfname);
// get rid of temporary file
unlink($tmpfname);
return $info;
}