我试图从mime类型字节验证一些Base64编码的图像,除了.png文件外,它们都能正确验证
png字节签名是 89 50 4E 47 0D 0A 1A 0A
我有一个允许的字节签名数组。
'imageBytes' => [
"jpeg" => "FFD8",
"png" => "89504E470D0A1A0A",
"gif" => "474946",
"bmp" => "424D"
],
我将一个base64编码的图像传给这个函数,并将我的允许数组
public function checkImageMimeBytes(string $imageData, array $imgByteArray) : string
{
if (!is_array($imgByteArray) || is_null($imgByteArray) || empty($imgByteArray)) {
throw new \LogicException('undefined image security config');
}
foreach ($imgByteArray as $mime => $hexBytes) {
$bytes = $this->getBytesFromHexString($hexBytes);
if (substr($imageData, 0, strlen($bytes)) == $bytes) {
return $mime;
} else {
throw new SecurityException;
}
}
throw new \LogicException('Invalid Mime Byte');
}
该函数从十六进制字符串中获取字节
public function getBytesFromHexString(string $hexData) : string
{
for ($count = 0; $count < strlen($hexData); $count += 2) {
$bytes[] = chr(hexdec(substr($hexData, $count, 2)));
}
if (!isset($bytes) || !is_array($bytes) || empty($bytes) || is_null($bytes)) {
throw new \LogicException;
}
return implode($bytes);
}
在测试时,它总是为.png图片抛出一个安全异常。
有什么信息可以解决这个问题吗?
添加测试图片
编辑:用FileReader()对javascript前端进行编码。
let reader = new FileReader()
reader.readAsDataURL(file)
reader.onloadend = (readEvent) => {
this.$emit('imageUploadReady', readEvent.currentTarget.result)
}
和你一样,我也有一个base64的图像($imageBase64Str
).
我需要得到这个图像的mime类型,它必须是有效的。
输入。$imageBase64Str
function imgMime($imgBytes){
if(is_null($imgBytes)){
return(false);
}
if(strlen($imgBytes)<12){
return(false);
}
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime=$finfo->buffer($imgBytes);
if(strncmp($mime, "image/", 6) != 0){
return(false);
}
return($mime);
}
$imageBytes=base64_decode($imageBase64Str,true);
if(!$imageBytes){
throw new Exception("cannot decode image base64");
}
$imageMime=imgMime($imageBytes);
if(!$imageMime){
throw new Exception("cannot recognize image mime");
}
如果您希望将图像类型限制在比 exif_imagetype
函数识别,你可以根据函数的 $imageMime
所回 image_type_to_mime_type。 功能。类似这样。
$allowedMimes=["image/jpeg","image/png","image/gif","image/bmp"];
if(!in_array($imageMime,$allowedMimes,true)){
throw new Exception("image mime not allowed: ".$imageMime);
}
当我设置 $imageBase64Str
到 iVBORw0KGgoAAAANSUhEUgAAAQwAAABuCAYAAADSxy12AAAgAElEQVR4XtV9267jSpJd8CaSukvVv+LpA...Vxt5tFRObQnEEvPk4fVOUFg5tz2709kx8kLz9c0yWJqDQQqfvvSxPV0wVSYRMAAAAASUVORK5CYII=
摘自 你的例子,我得到一个有效的 image/png
哑剧。然而,我没有得到酷似黑白的匿名奴才牛仔形象,而是得到了下面的紫紫色旋转方块。