我需要找到一种方法来验证用 PHP 编码的 base64 图像。
通过验证,我正在考虑 XSS 和其他类似的安全问题。
流程是:
用户有一些参数,其中一个 og 更多在 base64 编码图像字符串并将它们发布到我的网站。当我收到名为 img1 的参数 fx 时,使用 base64 编码的图像字符串作为值。
然后我想确保这个 base64 编码的字符串只包含图像并且没有任何标签和黑客会尝试使用的任何其他东西。
有谁知道任何可以帮助我的 PHP 函数或插件?
您可以使用以下代码验证文件类型:
$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/pdf
or image/jpeg
。
在$file_type
你下面你会得到一个文件类型 f.ex。图片。
在$extension
您下方,您将获得一个扩展名。
您可以使用finfo_buffer
一些预定义的常量,这可能会为您提供更多信息。
使用这些信息,您可以简单地验证它是图像还是 pdf 或您想要检查的任何其他内容。您可以在此页面中查看所有可用的 mimetype 。
手动的
您可以尝试使用imagecreatefromstring函数从字符串创建图像。
然后,您可以测试图像尺寸/类型。
如果您想更进一步,您可以创建一个新图像,然后尝试将用户图像复制到其上并将其用作最终图像。由于最终图像最初是由您创建的,因此任何黑客都很难通过。
我只会采用 base64 编码的字符串并将其放入图像标签中。但是在我正在构建的系统中,安全性是非常重要的事情,所以我只需要确保不能在 base64 编码图像中使用 XSS 之类的东西 :)
然后,您可以像处理任何其他用户输入一样执行此操作:htmlspecialchars
在将用户提供的文本放入 HTML 之前对其进行编码,以保持 HTML 的完整性。Base64 图像字符串也不例外。请参阅伟大的逃避现实(或:使用文本中的文本需要知道的内容)。
当然,一大堆图像数据可能会通过易受攻击的图像解析器让您面临完全不同的攻击向量。因此,您可能希望先将该图像字符串解码为图像资源,然后使用 gd 或 Imagick 函数再次保存,即打开并重新保存/重新编码图像。
$str = 'your base64 code' ;
if (base64_encode(base64_decode($str, true)) === $str && imagecreatefromstring(base64_decode($img))) {
echo 'Success! The String entered match base64_decode and is Image';
}