相对于浏览器上传,远程下载图像是否有任何额外的危险?

Are there any added dangers to downloading an image remotely opposed to browser upload?

我有一个图片上传站点,当用户上传图片时,我会检查大小、文件类型、扩展名等。

我现在正在考虑添加远程下载功能。是否有任何其他我应该考虑的安全问题,或者下载图像是否与用户从浏览器上传图像完全相同?

是否像将 $image 设置为 $_FILE['image']file_get_contents('http://url/image.ext') 然后进行现有检查一样简单?

我唯一能想到的另一件事是在尝试下载文件之前检查文件大小。

如果您决定允许远程文件获取,您应该使用流而不是将整个远程文件加载到内存中。

使用 fopen 并获取流而不是使用 file_get_contents 并接收字符串可以让您访问 stream_is_local function,这将允许您避开最明显的安全漏洞,例如:

$maliciousRemoteFetch = '~/.ssh/id_rsa';
$stream = fopen($maliciousRemoteFetch);
if (stream_is_local($stream)) {
    throw new \InvalidArgumentException("Hey, don't hack me, bro!");
}

stream_is_local 将在 URL 和数据 URI 上 return 错误。