在yii框架中处理base64图片上传需解析data url、校验mime与真实类型一致性、生成安全文件名并保存,拒绝非法格式(如svg)和无;base64,前缀的字符串。

在Yii框架中处理Base64编码的图片上传,需绕过传统表单文件提交逻辑,直接解析前端传来的data URL字符串,提取MIME类型与原始字节,保存为合法图像文件并校验安全性。忽略Base64头信息会导致文件损坏,未验证MIME类型可能引发任意文件写入风险。
解析Base64字符串并提取原始数据
从POST或JSON请求体中获取形如 data:image/png;base64,iVBORw0KGgo... 的字符串。
使用 substr 截取逗号后的内容,再用 base64_decode 解码为二进制流。
这一步必须严格判断是否存在 data: 前缀和 ;base64, 分隔符,否则解码会失败或产生乱码。
若字符串不含 ;base64,,说明不是标准data URL,【直接拒绝处理,返回400错误】。
校验MIME类型与图像格式一致性
方法一:从data URL头中提取MIME类型(如 image/jpeg),再用 getimagesizefromstring() 读取解码后的二进制数据,获取真实图像类型。
比较两者是否匹配——image/jpeg 对应 IMAGETYPE_JPEG,image/png 对应 IMAGETYPE_PNG,不一致则说明客户端伪造了MIME头。
方法二:用 finfo_buffer() 检测二进制流的真实类型,仅允许 image/jpeg、image/png、image/gif 三种。
【禁止接受 image/svg+xml 或 image/x-icon,它们可能携带脚本或绕过尺寸限制】。
生成安全文件名并保存到指定目录
第一步:用 uniqid() + random_int() 生成唯一前缀,拼接扩展名(由校验后的MIME类型映射得出)。
第二步:确认上传目录存在且可写,使用 mkdir($path, 0755, true) 递归创建路径。
第三步:调用 file_put_contents() 写入解码后的二进制数据,路径必须使用绝对路径,避免相对路径导致写入Web根目录外。
第四步:设置文件权限为 0644,防止执行权限被意外赋予。
写入完成后,不要返回原始Base64字符串,只返回相对URL路径或文件哈希标识。











