- 做者:陳大魚頭
- github: KRISACHAN
做爲一枚技術公衆號運營者,寫文章,發文章都是平常操做了,但在一第二天常的發文中卻意外地發現了微信公衆號的重大BUG,這到底是怎麼回事呢?javascript
在9月3日當天,魚頭我發了一篇名爲《個人<input />
不可能這麼可愛》的技術文章,原本覺得是常規發文,結果有人給我反饋,當點擊留言進入公衆號文章留言模塊的時候,會有BUG:html
我愣了1,2,3秒。。。心想:「咦,不對,這不是把 <input />
」 給宣傳成dom了嗎?前端
結果有了java
而後就在羣裏說了這事,知道的胖友們都紛紛行動起來去作測試。。。git
而後有了如下的測試流程:github
<input onfocus="alert('1')">
的文章;如下是復現漏洞的視頻數據庫
視頻連接安全
素材來自公衆號「前端真好玩」服務器
如今咱們來分析下這個BUG產生的緣由微信
首先標題中帶有 <input onfocus="alert('1')">
,網頁若是不作轉義處理,則會渲染成HTML。
在文章詳情頁中沒有這個問題,就說明在文章頁裏開發者是作了轉義的,可是在留言頁面裏卻出現了這個問題,說明開發者在這裏並無作標題的轉義。
雖然這個問題觸發條件比較艱難(基本只有開發者才懂),可是對於微信這種,億級日活的產品,出現這種低級的安全問題,確實沒想到。
咱們把這種安全問題稱之爲XSS攻擊。
根據攻擊源,咱們能夠將XSS攻擊分爲三類:
在這個場景中咱們遇到的是存儲型 XSS 攻擊。
此類攻擊是攻擊者將惡意代碼提交至服務器並保存在數據庫中,用戶訪問該頁面觸發攻擊行爲。
這種類型的攻擊常見於保存用戶編輯數據的場景下,好比案例中的發表文章,亦或者評論場景等等。
防範存儲型 XSS 攻擊的策略就是不相信一切用戶提交的信息,好比說用戶的評論、發表的文章等等。對於這些信息一概進行字符串轉義,主要是引號、尖括號、斜槓
const escape = str => {
str = str.replace(/&/g, '&')
str = str.replace(/</g, '<')
str = str.replace(/>/g, '>')
str = str.replace(/"/g, '&quto;')
str = str.replace(/'/g, ''')
str = str.replace(/`/g, '`')
str = str.replace(/\//g, '/')
return str
}
escape('<script>alert("hello world")</script>') // "<script>alert(&quto;hello world&quto;)</script>"
可是在顯示富文本的場景下其實不能把全部的內容都轉義了,由於這樣會把須要的格式也過濾掉。對於這種狀況,一般考慮採用白名單過濾的辦法。
複製代碼
// 使用 js-xss 開源項目
const xss = require('xss')
let html = xss('<h1 id="title">XSS</h1><script>alert("xss");</script>')
// -> <h1>XSS</h1><script>alert("xss");</script>
console.log(html)
在白名單的狀況下,h1標籤不會被轉義,可是script能被正常轉義。
複製代碼
而後魚頭心想,除了 <input />
標籤,是否是別的標籤也能夠呢?例如 <script></script>
而後我就找了個也有公衆號的朋友來幫我測試。可是這位朋友....
以迅雷不及掩耳之勢給反饋到了微信那邊。。。
而後微信那邊也是以迅雷不及掩耳之勢在當天就把這個BUG給解決了。
雖然以爲有點惋惜,還想再多作點測試。可是這畢竟是個漏掉,並且是很嚴重的那種,若是被別有用心的人來鑽空子,進行XSS攻擊(雖然不必定能攻擊),那麼對微信,對微信用戶來講也很容易就會形成損失。
雖然在開發的過程當中,有BUG是很正常的,可是仍是但願BUG能減小一些,尤爲是有很是龐大用戶羣的應用,更是如此。
各位在平常開發中有沒有遇到或者聽到過什麼讓你印象深入的BUG呢?有的話不妨在下方留言區域留言討論。