getimagesize()限制远程URL的文件大小

时间:2012-09-03 14:46:36

标签: php validation getimagesize

我可以使用getimagesize()来验证图像,但问题是如果淘气的用户将链接放到10GB random file那么它会破坏我的生产服务器的带宽。如何限制getimagesize()正在获取的文件大小? (例如,最大图像大小为5MB)

PS:我在询问之前做过research

3 个答案:

答案 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;
}