Anton Bogomolov Asked:2020-02-15 00:51:55 +0800 CST2020-02-15 00:51:55 +0800 CST 2020-02-15 00:51:55 +0800 CST Base64 字符串验证 772 如何使用 php 方法确保生成的 base64 字符串是 jpeg 图像? php 1 个回答 Voted Best Answer tutankhamun 2020-02-15T02:05:03+08:002020-02-15T02:05:03+08:00 不精确的方法 从 base64 解码前 16 个字节(得到 12 个字节)并与文件的 JPEG 签名进行比较。虽然,原则上,您甚至不能解码,而是将签名转换为 base64 并比较某些部分。 代码示例: function isLikeJpeg($in) { $signJPEG = "\xff\xd8\xff\xdb"; $signJFIF = "\xff\xd8\xff\xe0\x00\x00\x4a\x46\x49\x46\x00\x01"; $signEXIF = "\xff\xd8\xff\xe1\x00\x00\x45\x78\x69\x66\x00\x00"; $mask = "\xff\xff\xff\xff\x00\x00\xff\xff\xff\xff\xff\xff"; $head = base64_decode(substr($in, 0, 16)) & $mask; return ( substr($head, 0, 4) === $signJPEG || $head === $signJFIF || $head === $signJFIF ); } 该方法的不准确之处在于,尽管签名正确,但文件的内容可能根本不是 JPEG。 最准确但资源密集的方法 应用“不精确方法”后,如果您得到看起来像 JPEG 的结果,则需要检查内容。解码整个图片并提供功能imagecreatefromstring()。如果结果是假的,那么就没有图像。 请注意,如果您接受来自用户的“图像”,它可能会大到足以让 PHP 解释器超出其内存限制。因此,在应用第二部分之前,请检查结果字符串的长度。 您还可以使用 FileInfo 扩展名(函数finfo_file())。我没有检查,但这个扩展可能只比较签名和文件 也可以看看: 文件签名 base64_decode() 函数 imagecreatefromstring() 函数
不精确的方法
从 base64 解码前 16 个字节(得到 12 个字节)并与文件的 JPEG 签名进行比较。虽然,原则上,您甚至不能解码,而是将签名转换为 base64 并比较某些部分。
代码示例:
该方法的不准确之处在于,尽管签名正确,但文件的内容可能根本不是 JPEG。
最准确但资源密集的方法
应用“不精确方法”后,如果您得到看起来像 JPEG 的结果,则需要检查内容。解码整个图片并提供功能
imagecreatefromstring()
。如果结果是假的,那么就没有图像。请注意,如果您接受来自用户的“图像”,它可能会大到足以让 PHP 解释器超出其内存限制。因此,在应用第二部分之前,请检查结果字符串的长度。
您还可以使用 FileInfo 扩展名(函数
finfo_file()
)。我没有检查,但这个扩展可能只比较签名和文件也可以看看: