0x00 小编的问题
小编向我们反馈,从微信里复制出来的图片,会被微信屏蔽,无法显示
我们后天采用的是百度编辑器,而且已经做了远程图片本地化,于是检查微信的图片地址。
随便打开一篇微信文章,发现其图片地址如下:
http://mmbiz.qpic.cn/mmbiz_jpg/QeUoMcnKBk25dgQG6qxeicwFbSytxtia6EgAYiakC7JXJhss25yYQKwUC8w8SBibjfQjicAHOn4DoFHrEiaBQWncYFfg/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1
可以看到这个地址和平常的图片地址不一样,没有jpg、png等图片后缀,用浏览器保存后,为webp格式。
0x01 怀疑本地化代码
检查本地化代码,发现确实有通过后缀判断的地方,但是默认为jpg后缀。
0x02 检查前端
后端检查没有发现问题,于是又查看前端,打断点,定位到复制图片的js代码段,发现如下:
原来编辑器会保存图片的旧地址,并和后端发回的旧地址比较,如果不相等,不会替换为发回的新地址,这个机制还是比较严谨的。
看上图,发现后端发回的旧地址,对“&”进行了转义,于是旧地址比较不相等,所以没有替换为本地化后的新地址。
0x03 继续检查后端
问题又回到后端了,找到发回的相关代码,如下:
原来是htmlspecialchars的原因,但是这个又不能去掉,防止xss攻击,那么转义后,再把“&”替换回来,即:
str_replace("&","&",htmlspecialchars($imgUrl,ENT_QUOTES))
上面的ENT_QUOTES 是为了让htmlspecialchars把单引号也转义,更加安全。