內容安全策略(CSP)能夠幫助網頁應用程式開發者及伺服器管理員更易於管理網站內容,並防止跨網站腳本攻擊(XSS)。筆者分別在四個大眾較常使用的瀏覽器上,以一個樣本網站做測試,皆成功以CSP阻擋所有類型的XSS。
在眾多網站攻擊的類型中,跨網站腳本攻擊(XSS)是最常見的一種。XSS攻擊的模式包括:在使用者不知情的情況下,將惡意的腳本植入到使用者所瀏覽並信任的網站,然後攻擊者就可以從中取得該瀏覽器所存取的使用者資訊(例如: session tokens、cookies等)。而當攻擊者取得這些使用者資訊,就可以進行許多惡意行為,像是竊取個資、鍵盤側錄、網路釣魚、盜用使用者、遠端開啟電腦鏡頭進行監看…等。
即使是廣受大眾所使用的應用程式,都還是會受到XSS的攻擊,事實上,自從2003年,他們第一次回報給「電腦網路危機處理暨協調中心」的顧問,告知遭受攻擊開始,這些攻擊一直驚人的成長。開放網路軟體安全計畫(OWASP)組織在他們於2013年所公布的「網站應用程式十大弱點(OWASP Top 10)」將XSS列為第三名,並稱他為「最流行的網站應用程式安全漏洞」。白帽安全公司(WhiteHat Security)在2013年5月的網絡安全報告統計指出,網站應用程式所受到的攻擊中有43%皆來自XSS植入攻擊,由此可見這種攻擊行為的廣泛性。
XSS的類別
XSS可以分為持續性或非持續性,也可以建立於文字物件模型(DOM)
持續型XSS
這種攻擊種類是將惡意腳本植入到網站的資料庫中,當此網站沒有正確的從資料庫過濾腳本時,這個惡意腳本便可以存在於網站應用程式中,並且以該網站的權限在使用者的瀏覽器上執行。這種持續型XSS並不需要惡意連結才能成功觸發,只要瀏覽該網站便可以危害使用者。持續型的XSS通常較難被偵測到,並被認為比另外兩種XSS攻擊種類更具傷害性。因為惡意的腳本會自動渲染,所以並不需要鎖定特定的目標或是引誘使用者們進入第三方網站。由於上述的特性,攻擊者可以很輕易地隱藏他們的攻擊行為;舉例來說,在一個部落格中,攻擊者可以將惡意腳本鑲嵌在看似無害的留言或者評論中,這樣一來,拜訪這個網站的使用者們便會在不知情的情況下把他們的瀏覽器(還有儲存在瀏覽器的資料)暴露在風險中。
非持續型XSS
通常,攻擊者會將他的惡意腳本隱藏在某個網址中,將他偽裝成使用者的輸入,然後寄一封作為誘餌的電子郵件給受害者,引誘他們點及附加在郵件中的網址。受害者們點擊網址後,那些有害的腳本便會在他們的瀏覽器上開始執行,讓攻擊者可以通過認證,或是竊取資料。
DOM-base XSS
一個網站是由各種元素所組成的,像是字體、段落、表格等可以表達物件差別的格式。為了能夠動態的更新網站內容的結構以及風格等,所有網站應用程式與網頁會跟文件物件模型(DOM)交互作用,也就是一個可以存取這些網站元素的虛擬地圖,犧牲一個DOM會導致客戶端代碼以意外的方式執行。
了解內容安全策略
CSPs(內容安全策略)並不是一個新的構想。最初是由Mozilla基金會所開發的,當時(2001年)是CSP這個概念第一次被應用在火狐瀏覽器第四代上,並在2012年11月成為萬維網聯盟的推薦候選。由網站應用程式開發者,或伺服器管理者所寫的CSP可以作用在網頁上,讓瀏覽器知道哪些網頁資源是他被允許執行的。創造出CSP背後的動機是希望能在不大幅修改應用程式的來源碼之下仍然可以避免XSS攻擊。
CSP是如何運作的
一個採用CSP的瀏覽器只會遵循CSP的指令 ─ 一個規定編譯器(或直譯器)如何處理所獲得的輸入值的語言。預設情況下,CSP是被禁止在網站上使用內嵌腳本的。例如以下的XSS內嵌負載(使用Java Script):>

X
同時,CSP也提供使用Java Script中的evalv系列的功能。以下就是一個使用eval的XSS攻擊負載範例:
x
有支援的瀏覽器
根據萬維網聯盟(W3C)的規範,內容安全性策略標頭檔是標準標頭檔,並被目前大多數瀏覽器的版本所使用。包括了火狐23(含)以上的版本、Chrome 25(含)以上的版本、Safari 7(含)以上的版本,跟iOS Safari 7.1(含)以上的版本。
來源指令
CSP的來源指令控制當客戶端的瀏覽器遇到各類型被保護的網站內容(從JavaScript到連接位置)時,該如何反應。我們最常用來描述來源指令的是預設、腳本跟風格。
Default source.
網站應用程式開發者或是伺服器管理員使用預設來源(default source),或是default-src指令來定義資源的白名單(white list)。使用這些指令的範例如下:
Content-Security-Policy: default- src ‘self’
這是允許客戶端的瀏覽器只能從網站應用程式所屬的來源下載資源。
而 Content-Security-Policy: default- src ‘none’ 則是指定none這個字是沒有資源被允許存取。
Script source.
script-src指令控制的是網站上JavaScript的下載。其第一部分的範例如下
Content-Security-Policy: default- src ‘none’;
script-src script .example.com javascript.example .com
而第二部分允許客戶端的瀏覽器從script.example.com跟javascript.example.com下載腳本。第二部分default-src的政策制定也就是說,沒有資源(腳本)是允許的,除了從script.example.com和javascript.example.com加載。
Style source.
Style-SRC直接控制網頁上的Cascading Style Sheets (CSS)和其他網頁上的樣式。
Content-Security-Policy:
default- src ‘none’;
style-src ‘unsafe- inline’ maxcdn.bootstrapcdn.com
該政策允許使用內聯風格和僅bootstrapcdn.com樣式表。它不允許的任何其他來源,如連接,框架,和媒體源的加載。
Object source
Object –SRC定義資源的白名單且從該瀏覽器允許下載資源,同時構建