PHP验证base64编码的图像

时间:2012-09-03 13:55:13

标签: php base64 security xss

我需要找到一种方法来验证在PHP中编码base64的图像。

通过验证我正在考虑XSS和其他类似的安全问题。

流程是:

用户有一些参数,其中一个og在base64编码图像的字符串中,并将它们发布到我的网站。当我收到名为img1的参数fx时,其中base64编码的图像字符串为值。

然后我想确保这个base64编码的字符串只包含图像,并且没有任何标记和黑客会尝试使用的任何其他东西。

有谁知道任何可以帮助我的PHP函数或插件?

5 个答案:

答案 0 :(得分:2)

您可以尝试使用imagecreatefromstring函数从字符串创建图像。

然后,您可以测试图像尺寸/类型。

如果您想再往前走一步,您可以创建一个新图像,然后尝试将用户图像复制到其上并将其用作最终图像。由于最终图像最初是由您创建的,因此任何黑客都可以通过它获得非常小的机会。

答案 1 :(得分:2)

您可以使用以下代码验证文件类型:

$file = 'Your base64 file string';
$file_data = base64_decode($file);
$f = finfo_open();
$mime_type = finfo_buffer($f, $file_data, FILEINFO_MIME_TYPE);
$file_type = explode('/', $mime_type)[0];
$extension = explode('/', $mime_type)[1];

echo $mime_type; // will output mimetype, f.ex. image/jpeg
echo $file_type; // will output file type, f.ex. image
echo $extension; // will output extension, f.ex. jpeg

$acceptable_mimetypes = [
    'application/pdf',
    'image/jpeg',
];

// you can write any validator below, you can check a full mime type or just an extension or file type
if (!in_array($mime_type, $acceptable_mimetypes)) {
    throw new \Exception('File mime type not acceptable');
}

// or example of checking just a type
if ($file_type !== 'image') {
    throw new \Exception('File is not an image');
}

$mime_type下,您会得到类似application/pdfimage/jpeg的信息。

$file_type下,您将获得文件类型f.ex。图片。

$extension下,您将获得扩展名。

使用finfo_buffer,您可以使用几个predefined constants,这可能会为您提供更多信息。

使用这些信息,您可以简单地验证它是图像还是pdf或您要检查的任何其他内容。您可以在this page中检入所有可用的mimetypes。


手册

PHP: finfo_open

PHP: finfo_buffer

PHP: finfo_buffer - Predefined Constants

base64_decode

MIME types (IANA media types)

答案 2 :(得分:0)

  

我只会使用base64编码的字符串并将其放在图像标记中。但是安全性在我正在构建的系统中非常重要,所以我只需要确保像XSS这样的东西不能用于base64编码的图像:)

然后,您可以像使用任何其他用户输入一样执行此操作:htmlspecialchars - 在将用户提供的文本放入HTML之前对其进行编码,以保持HTML的完整性。 Base64图像字符串也不例外。请参阅The Great Escapism (Or: What You Need To Know To Work With Text Within Text)

当然,一小撮图像数据可能会通过易受攻击的图像解析器向您打开完全不同的攻击向量。因此,您可能希望首先将该图像字符串解码为图像资源,然后使用gd或Imagick函数再次保存它,即打开并重新保存/重新编码图像。

答案 3 :(得分:0)

试试这个库

https://github.com/imaimai86/Intervention-Base64Image

它使用干预图像库来验证base64编码图像

答案 4 :(得分:0)

themeid=org.eclipse.e4.ui.css.theme.e4_dark