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把單引號也轉義,更加安全。