我尝试从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)
}
答案 0 :(得分:0)
就像您一样,我有一个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
函数识别的图像类型更窄的哑剧集,则可以根据image_type_to_mime_type函数返回的$imageMime
引发错误。像这样:
$allowedMimes=["image/jpeg","image/png","image/gif","image/bmp"];
if(!in_array($imageMime,$allowedMimes,true)){
throw new Exception("image mime not allowed: ".$imageMime);
}
将your example中提取的$imageBase64Str
设置为iVBORw0KGgoAAAANSUhEUgAAAQwAAABuCAYAAADSxy12AAAgAElEQVR4XtV9267jSpJd8CaSukvVv+LpA...Vxt5tFRObQnEEvPk4fVOUFg5tz2709kx8kLz9c0yWJqDQQqfvvSxPV0wVSYRMAAAAASUVORK5CYII=
时,我得到一个有效的image/png
哑剧。但是,我没有得到很酷的黑白匿名小仆牛仔形象,但下面是下面的紫色/紫色旋转方块: