base64校验需四步:先检查长度%4==0;再验证填充符=仅出现在末尾且数量为0/1/2;接着用严格正则/^[a-za-z0-9+/]{2,}={0,2}$/匹配;最后调用base64_decode($str, true)终审,并对data uri先剥离前缀再校验。

Base64字符串长度不满足%4==0时直接拒绝
Base64编码要求原始字符串长度必须是4的倍数,否则一定非法。很多开发者跳过这步直接上正则,结果把"abc="(长度4但内容非法)和"abcd"(长度4且合法)混为一谈。先做长度校验能快速筛掉大量无效输入,避免后续正则误判或浪费CPU。
- 写法:
if (strlen($str) % 4 !== 0) return false; - 注意:空字符串
""长度为0,满足%4==0,但需结合后续校验判断是否真有效 - 这个检查应在任何正则匹配之前执行,尤其在高频校验场景下能显著降低开销
填充符=只能出现在末尾且数量只能是0、1或2个
Base64规范规定填充只用于对齐,且仅出现在字符串末尾。出现"AB=C"或"A==="这类情况,无论正则怎么写都该判定为非法。单纯用[A-Za-z0-9+/=]匹配会放过这些错误。
- 推荐正则片段:
/^[A-Za-z0-9+\/]{2,}={0,2}$/—— 强制=只在末尾且最多两个 - 但注意:
XX==、XXX=、XXXX是唯一合法结尾形式;X=(长度2)、XX=(长度3)本身就不满足%4==0,已被前一步拦截 - 别用
.*=这种模糊写法,它会匹配到中间含=的非法串
用base64_decode($str, true)做严格解码验证
PHP的base64_decode()默认宽松模式,遇到非法字符可能静默截断或补零,导致假阳性。开启$strict = true参数后,只要输入含非Base64字符或填充错误,就返回false,这才是真正可靠的终审。
- 必须加第二个参数:
base64_decode($str, true) === false - 注意:即使长度和正则都过关,
"ABCD=="(多了一个=)也会在此步失败 - 不要省略
true——PHP 8.5.5 仍保持此参数默认为false,不显式传参等于放弃严格校验
数据URI格式要先剥离data:.*;base64,前缀
前端传来的图片Base64常带data:image/png;base64,iVBORw...这种头,直接拿整串去正则或base64_decode会失败。提取不干净会导致base64_decode返回false,但错误原因不是Base64本身,而是前缀干扰。
- 安全提取方式:
preg_match('/^data:[^;]+;base64,(.*)$/', $str, $matches) ? $matches[1] : null - 别用
explode()或substr()硬切,data:text/plain;base64,...里的逗号可能出现在MIME类型中 - 提取后务必再走一遍长度校验——因为前缀被移除,新字符串必须重新满足%4==0
true和数据URI的前缀剥离。这两个点漏掉一个,就可能让"data:image/jpg;base64,ABCD=="这种明显错误的串通过校验。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











