相对于浏览器上传,远程下载图像是否有任何额外的危险?
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 错误。
我有一个图片上传站点,当用户上传图片时,我会检查大小、文件类型、扩展名等。
我现在正在考虑添加远程下载功能。是否有任何其他我应该考虑的安全问题,或者下载图像是否与用户从浏览器上传图像完全相同?
是否像将 $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 错误。