WEB安全之XSS注入預(yù)防策略——CSP
WEB的盛行讓這個(gè)網(wǎng)絡(luò)社會更非富,隨之而來的就是安全問題。如果何安全的接受用戶輸入并正確的顯示出來是絕大多部WEB程序的致追求。其中之一就是防止XSS,一般性而言XSS的主要危害主要是:一是頁面可能被惡意或其他原因所定制,二是有可能造成站內(nèi)數(shù)據(jù)外泄。
XSS頁面定制
現(xiàn)代WEB內(nèi)容很多由廠商和用戶共同產(chǎn)生,下面的例子說明一個(gè)由廠商和用戶共同產(chǎn)生的數(shù)據(jù):
<div class="profile">
<dl>
<dt>$title</dt>
<dd>$description</dd>
</dl>
</div>
其中$title和$description代表了兩個(gè)變量,用于輸出一個(gè)由用戶產(chǎn)生的標(biāo)題和內(nèi)容。以$title為例,如果$title中的內(nèi)容是:<script>alert(1)</script> 那么運(yùn)行后輸出到瀏覽器端的內(nèi)容即為:
<div class="profile">
<dl>
<dt><script>alert(1)</script></dt>
<dd>description</dd>
</dl>
</div>
那么這段代碼的結(jié)果只有一種可能:如大家所見會執(zhí)行這段script,這當(dāng)然不是開發(fā)者所期望的。這個(gè)頁面我們就可以理解為被定制了。也許當(dāng)你拿到了一個(gè)HOST可以信任的一個(gè)URL,但是很不幸這個(gè)URL已經(jīng)被惡意的傳播者通過XSS所定制,那么也許用戶就可能會相信這個(gè)頁面所輸出的內(nèi)容。那結(jié)果是可想而知的。為了預(yù)防這種情況。通常情況下WEB開發(fā)者會通過escape safe charactor 的方式解決(把 < 變成 < 等)。但是這種預(yù)防只停留在通過轉(zhuǎn)義讓輸出和顯示與輸入一致。
這只是一種解決HTML注入的手段。從安全的角度出發(fā),https://i.xiaomi.com 應(yīng)該只允許顯示來自 https://i.xiaomi.com 的圖片。同樣的 https;://i.xiaomi.com 也只允許https://land.xiaomi.net 域名下的資源去處理 https://i.xiaom.com上的事務(wù)?;谝陨系陌踩拗贫ㄏ拢诂F(xiàn)有機(jī)制肯定是滿足不了需求了。不過幸好W3C發(fā)布了基于該種安全限定的的CSP草案。目前該草案還處于完善階段,這就意味著該草案隨時(shí)都有可能被其他規(guī)范或草案所替代,當(dāng)然也有可能放棄。不過IE10以及Webkit已經(jīng)有對該草案的實(shí)現(xiàn),有了瀏覽器廠商支持,這事就靠譜了。
什么是CSP?
CSP是由單詞 Content Security Policy 的首單詞組成,該草案旨在減少(注意這里是減少而不是消滅哦~)一種內(nèi)容注入,比如跨站腳本(可能是攻擊哦~親?。?。CSP是一種由開發(fā)者定義的安全性政策性申明。前面幾句說的太繞人了,說簡單點(diǎn)就是通過CSP所約束的的規(guī)責(zé)指定可信的內(nèi)容來源(這里的內(nèi)容可以指腳本、圖片、iframe、fton、style等等可能的遠(yuǎn)程的資源)。通過CSP協(xié)定,讓W(xué)EB處于一個(gè)安全的運(yùn)行環(huán)境中。
如何應(yīng)用
CSP可以由兩種方式指定:HTTP Header 和HTML。HTTP是在HTTP由增加Header來指定,而HTML級別則由Meta標(biāo)簽指定。CSP有兩類:Content-Security-Policy 和 Content-Security-Policy-Report-Only。(大小寫無關(guān))
HTTP header :
"Content-Security-Policy:" 策略
"Content-Security-Policy-Report-Only:" 策略
HTTP Content-Security-Policy 頭可以指定一個(gè)或多個(gè)資源是安全的,而Content-Security-Policy-Report-Only則是允許服務(wù)器檢查(非強(qiáng)制)一個(gè)策略。多個(gè)頭的策略定義由優(yōu)先采用最先定義的。( 目前Firefox使用x-Content-Security-Policy,WebKit使用X-WebKit-CSP?;蛟S在不久的將來草案最終確定下來之后會統(tǒng)一吧?)
HTML Meta :
<meta http-equiv="content-security-policy" content="策略">
<meta http-equiv="content-security-policy-report-only" content="策略">
meta標(biāo)簽與HTTP頭只是行式不同而作用是一致的。與HTTP 頭一樣,優(yōu)先采用最先定義的策略。如果HTTP頭與META定義同時(shí)存在,則優(yōu)先采用HTTP中的定義。
如果用戶瀏覽器已經(jīng)為當(dāng)前文檔執(zhí)行了一個(gè)CSP的策略,則會跳過META的定義。如果META標(biāo)簽缺少 content 屬性也同樣會跳過。
針對開發(fā)者草案中特別的提示一點(diǎn):為了使用策略生效,應(yīng)該將 meta 元素頭放在開始位置,以防止提高人為的CSP策略注入。
當(dāng)然CSP草案還在完善之中,草案中也特別的提出了幾點(diǎn)問題,比如應(yīng)該約定一種META機(jī)制以確保文檔不會被注入惡意的CSP規(guī)則。
CSP語法
CSP策略內(nèi)容由一個(gè) ; 分隔是若干個(gè)CSP指令(每條CSP指令的前后空格會被無視掉):
policy = [ directive *( ";" [ directive ] ) ]
每一個(gè)CSP由一個(gè) 指令名 和 一個(gè)可選的指令值 組成
directive = *WSP [ directive-name [ WSP directive-value ] ]
directive-name = 1*( ALPHA / DIGIT / "-" )
directive-value = *( WSP / <VCHAR except ";" and ",">
CSP策略可以是一個(gè)指定的URL或是 協(xié)議(可選)+HOST+POST(可選)+路徑(可選)的 指令。該指令說明了資源為安全的或非安全的。
示例:
1.只允許本站資源
Content-Security-Policy: default-src ‘self’
2.允許本站的資源以及任意位置的圖片以及trustedscripts.example.com下的腳本。
Content-Security-Policy: default-src ‘self’; img-src *;
script-src trustedscripts.example.com
更多關(guān)于CSP的介紹可以參考W3C的相關(guān)文檔: https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#content-security-policy-header-field
一部分中文翻譯:http://www.w3.org/html/ig/zh/wiki/CSP
關(guān)于CSP的討論
首先CSP的出現(xiàn)肯定可以一定程度上的減少XSS的攻擊(因?yàn)楣舫杀咎岣撸?,但并不一定就意味著CSP普及了XSS攻擊就沒有了
資料:
JPEG網(wǎng)頁圖片病毒 http://baike.baidu.com/view/540655.htm
Shutting Down XSS with Content Sercurity Policy http://blog.mozilla.org/security/2009/06/19/shutting-down-xss-with-content-security-policy/
Content Security Policy ( SCP ) http://developer.chrome.com/extensions/contentSecurityPolicy.html