【问题标题】:PHP Validate base64 encoded imagesPHP验证base64编码图像
【发布时间】:2012-09-03 13:55:13
【问题描述】:

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

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

流程是:

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

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

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

【问题讨论】:

  • 图片包含什么并不重要,重要的是你用它做什么。如果您将应该是图像的东西视为图像并且仅作为图像,那么任何人都不应该有机会注入 HTML 标记。因为您为什么将图像评估为 HTML?因此,我们需要更多的上下文来正确回答这个问题。
  • 我只会将 base64 编码的字符串放入图像标签中。但是在我正在构建的系统中,安全性是非常重要的事情,所以我只需要确保不能在 base64 编码图像中使用 XSS 之类的东西 :)
  • 您的数据源是什么,为什么一开始就使用 base64 编码?如何将其输出为src="data:image/jpeg;base64,,或者将其解码并将数据保存到实际图像中?

标签: php base64 security xss


【解决方案1】:

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

$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 中查看所有可用的 mimetype。


手动

PHP: finfo_open

PHP: finfo_buffer

PHP: finfo_buffer - Predefined Constants

base64_decode

MIME types (IANA media types)

【讨论】:

    【解决方案2】:

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

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

    如果您想更进一步,您可以创建一个新图像,然后尝试将用户图像复制到其上并将其用作最终图像。由于最终图像最初是由您创建的,因此任何黑客都很难通过。

    【讨论】:

      【解决方案3】:

      我只会将 base64 编码的字符串放入图像标签中。但是在我正在构建的系统中,安全性是非常重要的事情,所以我只需要确保不能在 base64 编码图像中使用 XSS 之类的东西 :)

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

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

      【讨论】:

        【解决方案4】:

        试试这个库

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

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

        【讨论】:

          【解决方案5】:
          $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';
          }
          

          【讨论】:

          • 这个答案缺少教育解释。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-04-01
          • 2014-06-09
          • 2016-12-26
          • 1970-01-01
          • 1970-01-01
          • 2012-12-26
          • 1970-01-01
          相关资源
          最近更新 更多