我可以使用getimagesize()
来验证图像,但问题是如果淘气的用户将链接放到10GB random file那么它会破坏我的生产服务器的带宽。如何限制getimagesize()
正在获取的文件大小? (例如,最大图像大小为5MB)
PS:我在询问之前做过research。
答案 0 :(得分:2)
您不希望开始使用getimagesize('http://example.com')
这样的内容,因为这会下载图像一次,检查大小,然后丢弃下载的图像数据。 那真正浪费了带宽。
因此,将下载过程与图像大小的检查分开。例如,使用fopen
打开图像URL,一点一点地读取并将其写入临时文件,并记录您已阅读的数量。一旦你穿过5MB并且仍未完成阅读,你就停止并拒绝该图像。
你可以尝试在开始实际下载之前读取HTTP Content-Size标头以清除明显的大文件,但你不能依赖它,因为它可以被欺骗或遗漏。
答案 1 :(得分:2)
以下是example,您需要进行一些更改以符合您的要求。
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;
}
答案 2 :(得分:2)
您可以单独下载该文件,强加您希望下载的最大尺寸:
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;
}