跨站腳本(XSS)和跨站腳本包含(XSSI)之間的區別是什么?防御方法有什么不同?
Michael Cobb:自上世紀90年代,攻擊者就已經開始利用XSS漏洞,并且,最主要的網站(例如谷歌、雅虎和Facebook)都在一定程度上受到過XSS漏洞的影響。與大多數應用層攻擊(例如SQL注入),基于XSS的攻擊會攻擊應用的用戶,而不是應用或服務器。這些攻擊的工作原理是注入代碼(通常例如JavaScript客戶端腳本)到Web應用的輸出。大部分網站有很多注入點,包括搜索域、cookies和表格。雖然這些惡意腳本不能直接感染服務器端信息,它們仍然可以破壞網站的安全性。通過使用Document Object Model操作來更改表格值,改變網頁的外觀或切換表格操作以張貼提交的數據到攻擊者的網站,攻擊者可以竊取數據、控制用戶的會話、運行惡意代碼或用作網絡釣魚欺詐的一部分。
XSSI是XSS的一種形式,它利用了這樣一個事實,即瀏覽器不會阻止網頁加載圖像和文字等資源,這些資源通常托管在其他域和服務器。例如,腳本可能提供攻擊者需要的功能,幫助創建特定的頁面—很多網站包含托管在https://developers.google.com/speed/libraries/#jquery的JavaScript庫jQuery。然而,這種包含可能被利用來從一個域名讀取用戶數據—當用戶正在訪問另一個域名時。例如,如果ABC銀行有一個腳本用于讀取用戶的私人賬戶信息,攻擊者可以在其自己的惡意網站(www.fraudulentbank.com)包含這個腳本,當ABC銀行的客戶訪問攻擊者的網站時,攻擊者就可以從ABC銀行的服務器提取用戶信息。
開發者可以部署多種措施來抵御XSSI攻擊。其中一種方法是向用戶提供獨特的不可預測的授權令牌,在服務器響應任何請求之前,需要發送回該令牌作為額外的HTTP參數。腳本應該只能響應POST請求,這可以防止授權令牌作為GET請求中的URL參數被暴露,同時,這可以防止腳本通過腳本標簽被加載。瀏覽器可能會重新發出GET請求,這可能會導致一個操作會執行一次以上,而重新發出的POST請求需要用戶的同意。
在處理JSON請求時,在響應中增加非可執行前綴,例如“ ”,以確保腳本不可執行。在相同域名運行的腳本可以讀取響應內容以及刪除前綴,但在其他域名運行的腳本則不能。此外,開發者還應該避免使用JSONP(具有填充功能的JSON)來從不同域名加載機密數據,因為這會允許釣魚網站收集數據。同時,發送響應表頭“X-Content-Type-Options: nosniff”也將幫助保護IE和谷歌Chrome用戶免受XSSI攻擊。
為了應對XSS攻擊,可在HTTP Content-Type響應表頭或者HTML代碼中meta標簽中http-equiv屬性中指定CHARSET,讓瀏覽器不會解譯其他字符集的特殊字符編碼。對于使用ASP.NET開發網站的開發者,微軟Anti-Cross Site Scripting Library可以幫助保護Web應用抵御跨站腳本漏洞。
現在有很多開源漏洞掃描工具可供開發者使用,以測試其代碼是否容易遭受XSS攻擊,例如Vega、Wapiti、OWASP的Zed Attack Proxy和Skipfish。企業應該定期對網站進行掃描,同時,在底層代碼變更或依靠第三方庫的功能集成到各種網頁時,也應該掃描網站。