PC版微信截图的bug

客户报障,微信截图,粘贴到微信中再复制出来后为jpg格式图片,上传系统显示图片格式错误;使用原始图片上传就没问题(也是jpg格式)

查看代码,系统对图片格式的校验规则如下:

public function rules(){
    return [
        ['file', 'file', 'skipOnEmpty' => false, 'extensions' => ['jpg', 'png', 'jpeg'],
        'maxSize' =>3*1024*1024, 'message' => 'UploadFail:upload_incorrect',
        'tooBig' => 'InvalidFile:size_invalid',
        'mimeTypes' => ['image/jpeg', 'image/png'],
        'checkExtensionByMimeType' => true,
        'wrongExtension' => 'InvalidFile:type_invalid',
        'uploadRequired' => 'MissingParameter:missing_parameter',
        'wrongMimeType' => 'InvalidFile:type_invalid'],
    ];
}

可以看到允许拓展名为Jpg、png和jpeg;找到校验器:yii\validators\Validator,可以看到文件校验器:

查看文件校验器中校验拓展名的部分:

这里开启了checkExtensionByMimeType校验,在FileHelper::getMimeType()埋点查看系统解析出来的mimeType是image/png,令人很惊讶,于是查看FileHelper::getMimeType()方法:

这里打印出来确实解析微信截图的时候,值为impage/png ,就开始怀疑是图片本身有问题了。用getimagesize()函数验证一下这个图片:

<?php

$size = getimagesize('a');
var_dump($size);

 得到的返回值如下:

看来这个图片的mime type确实为image/png格式了,于是想看看图片前几个字节当中有没有什么信息,查看图片的十六进制格式:

图片前几个字节有些对应关系:

1.JPEG/JPG
- 文件头标识 (2 bytes): $ff, $d8 (SOI) (JPEG 文件标识) 
- 文件结束标识 (2 bytes): $ff, $d9 (EOI) 

2.TGA
- 未压缩的前5字节     00 00 02 00 00
- RLE压缩的前5字节     00 00 10 00 00

3.PNG
- 文件头标识 (8 bytes)     89 50 4E 47 0D 0A 1A 0A

4.GIF
- 文件头标识 (6 bytes)     47 49 46 38 39(37) 61
                                               G    I    F    8   9 (7)    a

5.BMP
- 文件头标识 (2 bytes)     42 4D
                                               B     M

6.PCX
- 文件头标识 (1 bytes)     0A

7.TIFF
- 文件头标识 (2 bytes)     4D 4D 或 49 49

8.ICO
- 文件头标识 (8 bytes)     00 00 01 00 01 00 20 20 

9.CUR
- 文件头标识 (8 bytes)     00 00 02 00 01 00 20 20

10.IFF
- 文件头标识 (4 bytes)     46 4F 52 4D
                                               F    O    R    M

11.ANI
- 文件头标识 (4 bytes)     52 49 46 46
                                                R    I    F   F 

  • JPEG我们知需要比对文件头的$ff, $d8这两个字符,而不用读取最后的两个结束标识了。
  • TGA,ICO,CUR只需比对第三个与第五个字符即可。
  • PNG比对[89][50]这两个字符。
  • GIF比对[47][49][46]与第五个字符。

所以问题定位出来了:微信截图,粘贴后再复制出来,虽然粘贴后缀名称是jpg格式,但是查看图片的前两个字节就能发现其实它是个png格式的。mime type格式和拓展名格式不一致导致系统校验未通过。

 本文参考了:https://blog.csdn.net/july_young/article/details/80854926

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值