在PHP中如何校验base64格式图片的合法性?
判断Base64格式图片合法性的方案
1 前置格式校验
首先匹配Base64图片的标准URI前缀,合法的Base64图片必须以data:image/[格式];base64,开头,其中[格式]为jpeg、png、gif、webp等常见图片类型,不符合该规则可直接判定为不合法。
其次校验前缀后的Base64编码内容:仅允许出现大小写英文字母、数字、+、/四类字符,末尾最多允许2个=作为填充符,且内容总长度必须是4的倍数,不符合则为非法Base64内容。
2 核心内容校验
前置校验仅能过滤格式明显错误的内容,无法判断编码内容是否为真实图片,必须对解码后的二进制内容做校验,不同语言的实现思路一致:
- PHP 可直接调用
getimagesizefromstring()函数读取解码后的二进制内容,能正常返回图片宽高、类型等信息即为合法图片 - Python 可使用PIL库的
Image.open()加载解码后的二进制流,无报错即为合法图片 - 前端JS 可创建Image实例,将Base64地址赋值给src属性,监听
onload事件触发即为合法,onerror触发即为非法
对应需求的PHP实现代码
$pic = 'data:image/jpeg;base64,/9j/4AAQSkZJ....'; // 校验标准Base64图片前缀 if (!preg_match('/^data:image\/(jpeg|png|gif|webp);base64,/i', $pic)) { echo "Not base64 image"; exit; } // 提取纯Base64编码内容 $pureBase64 = substr($pic, strpos($pic, ',') + 1); // 校验Base64字符规则 if (!preg_match('/^[A-Za-z0-9+\/]+={0,2}$/', $pureBase64) || strlen($pureBase64) % 4 !== 0) { echo "Not base64 image"; exit; } // 解码后校验是否为有效图片 $imageBinary = base64_decode($pureBase64); $imageInfo = getimagesizefromstring($imageBinary); if ($imageInfo) { echo "{$pic} is base64 image"; } else { echo "Not base64 image"; }
注意事项
- 仅做格式匹配校验极易被伪造内容绕过,必须增加解码后的内容校验才能保证结果准确
- 可根据业务需求增加Base64长度限制,避免恶意构造的超大内容占用过多服务器资源
内容的提问来源于stack exchange,提问作者Hazem El-behairy
相关产品推荐
相关产品推荐

