使用Base64编码的图片存在的安全问题。

6
我有一个接受base64编码图像数据的API,需要解码数据,保存图像文件,然后从该图像创建缩略图。
我担心如果在尝试创建缩略图之前不正确验证POST负载的内容,则可能会执行恶意代码。
到目前为止,我拥有的基本工作流程如下。是否有足够的验证可以使我不必担心安全问题?我想我担心某个人编码了一些糟糕的东西,然后当下面的其中一个图像函数被调用时,网络就会崩溃。
<?php

$decodedImage = base64_decode($_POST["canvas"]);
if ($decodedImage === false) {
    // Error out
}

$imageSizeValidation = getimagesizefromstring($decodedImage);
if ($imageSizeValidation[0] < 1 || $imageSizeValidation[1] < 1 || !$imageSizeValidation['mime']) {
    // Error out
}

$tempFilePath = "/tmp/" . microtime(true) . "-canvas-web.jpg";
file_put_contents($tempFilePath, $decodedImage);

$originalWidth = $imageSizeValidation[0];
$originalHeight = $imageSizeValidation[1];
$newWidth = 49;
$newHeight = 49;

$scaleWidth = $newWidth / $originalWidth;
$scaleHeight = $newHeight / $originalHeight;
$scale = min($scaleWidth, $scaleHeight);

$width = (int)($originalWidth * $scale);
$height = (int)($originalHeight * $scale);

$xpos = (int)(($newWidth - $width) / 2);
$ypos = (int)(($newHeight - $height) / 2);

$oldImage = imagecreatefromjpeg($tempFilePath);
$newImage = imagecreatetruecolor($width, $height);
$background = imagecolorallocate($oldImage, 255, 255, 255);

imagefilledrectangle($newImage, 0, 0, $width, $height, $background);

imagecopyresampled($newImage, $oldImage, $xpos, $ypos, 0, 0, $width, $height, $originalWidth, $originalHeight);
imagedestroy($oldImage);

imagejpeg($newImage, "/path/to/new.jpg", 90);

imagedestroy($newImage);
1个回答

2

没有得到任何答案,所以对于那些对我最终做了什么感兴趣的人:

在进一步调查后,我发现我最大的担忧之一是有效的图像文件编码为内联PHP、Ruby等。例如: 一个带有以下内容的图像结尾:

<?php phpinfo();

我最终将解码后的图像数据传递给imagecreatefromstring(),然后通过imagejpeg()将图像保存到临时目录中。这似乎消除了原始图像数据中的任何编码PHP。此时,我使用getimagesize()验证了保存的图像的图像大小数据。假设此时一切都是有效的,我将图像移动到永久位置。
我改变的另一件事是,我使用哈希而不是基于静态字符串和microtime()的文件名。
关于注入代码的图像的担忧,我发现这个链接很有帮助:https://www.owasp.org/index.php/Unrestricted_File_Upload 对于整体想法,我也发现这个SO帖子很有用:Validating base64 encoded images 最后,以下书籍首先引起了我对具有代码的图像的担忧:http://www.apress.com/9781430233183

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接