PHP imagecreatefromstring 安全风险?

PHP imagecreatefromstring security risk?

提问人:JohnyFree 提问时间:6/4/2023 最后编辑:JohnyFree 更新时间:6/4/2023 访问量:110

问:

读完这篇博文后,我意识到 getimagesize() 并不能提供绝对的安全性,所以我决定根据这个答案使用 imagepng。但是,为了能够从通过 xmr 请求上传的图像中使用 imagepng,我需要首先使用这个:

$input = fopen("php://input","r");
$temp = tmpfile();
$target = fopen($path,"w")
fseek($tamp,0,SEEK_SET)
stream_copy_to_stream($temp,$target_file_name)

然后我就可以使用

$sourceImg = @imagecreatefromstring(@file_get_contents($source));
if ($sourceImg === false) {
  throw new Exception("{$source}: Invalid image.");
}
$width = imagesx($sourceImg);
$height = imagesy($sourceImg);
$targetImg = imagecreatetruecolor($width, $height);
imagecopy($targetImg, $sourceImg, 0, 0, 0, 0, $width, $height);
imagedestroy($sourceImg);
imagepng($targetImg, $target);
imagedestroy($targetImg);

如果图像包含一些恶意代码,在这种情况下使用 fopen 和 stream_copy_to_stream 会带来任何风险吗?如果是这样,如果使用 xmr 上传图像,有没有更好的方法?

编辑: 正如@your常识所指出的那样,我可以简单地使用 .但是,现在的问题是,如果使用 imagecreatefromstring(file_get_contents(“php://input”));具有任何风险。imagecreatefromstring(file_get_contents("php://input"));

PHP 安全 fopen

评论

4赞 Your Common Sense 6/4/2023
我不明白所有这些流用具的意义。你不能只做imagecreatefromstring(file_get_contents(“php://input”));吗?
0赞 shingo 6/4/2023
你能统一这些变量名称吗?
2赞 Honk der Hase 6/4/2023
当您将数据保存到文件中时,风险就开始了。它可能是一些恶意内容,这些内容现在实际存在于您的服务器上。这是代码注入攻击的典型漏洞。
0赞 JohnyFree 6/4/2023
@YourCommonSense说得好。使用 imagecreatefromstring(file_get_contents(“php://input”));是否仍然存在风险?
1赞 deceze 6/4/2023
这里的风险是,如果 gd 库包含一些缺陷,这些缺陷可能会被一些专门制作的内容触发,并会导致一些可利用的缓冲区溢出或类似的东西。您可以仔细阅读已知的错误报告和漏洞列表,看看是否有任何可能需要担心的问题。

答:

0赞 O. Jones 6/4/2023 #1

imageCreateFromString() 是一种相当安全的清理上传图像文件的方法,只要您的 PHP 和 Web 服务器代码保持在最新的安全补丁级别即可。清理 === 检查是否有恶意或畸形内容。

在将图像存储在服务器文件系统上以供以后下载之前,请确保从图像文件的实际内容生成图像文件扩展名(.jpg、.png 等)。不要相信上传图像的人传递给您的文件扩展名。这样的事情会起作用。

$size = getimagesizefromstring( whatever );
$extension = image_type_to_extension( $size[2] );

还要清理传递给您的文件名。为了获得最佳的跨平台结果,它应该全部小写。并且它不应包含 、 或字符。DIRECTORY_SEPARATOR/.