目錄
1 背景
2 縮寫
3 測試方法
4 實例
5 避免的方法
5.1 程式設計方面
5.2 使用者方面
背景
當網景(Netscape)最初推出JavaScript語言時,他們也察覺到準許網頁伺服器傳送可執行的程式碼給一個瀏覽器的安全風險(即使僅是在一個瀏覽器的沙盒裡)。它所造成的一個關鍵的問題在於使用者同時開啟多個瀏覽器視窗時,在某些例子裡,網頁里的片斷程式碼被允許從另一個網頁或物件取出資料,而因為惡意的網站可以用這個方法來嘗試竊取機密資訊,所以在某些情形,這應是完全被禁止的。為了解決這個問題,瀏覽器採用了與最初相同的決策──允許來自相同網域名稱系統和使用相同協定的物件與網頁之間的任何互動。這樣一來,惡意的網站便無法藉由JavaScript在另一個瀏覽器竊取機密資料。此後,為了保護使用者免受惡意的危害,其他的瀏覽器與伺服端指令語言採用了類似的存取控制決策。一般而言,跨網站指令碼的漏洞常見於網頁允許攻擊者通過這些機制的弱點。由於發現了巧妙的注入惡意的指令碼到由其他網域服務的網頁方法,攻擊者可得到了更高的特權,竊取機密的網頁內容、會談的cookie、以及許多其他的物件。
縮寫
Cross-site scripting的縮寫是CSS,但因為CSS在網頁設計領域已經被廣泛指層疊樣式表(Cascading Style Sheets),所以將Cross改以發音相近的X做為縮寫。但早期的檔案還是會使用CSS表示Cross-site scripting。
測試方法
通常有一些方式可以測試網站是否有正確處理特殊字元:
><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
<script>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
%3Cscript%3Ealert('XSS')%3C/script%3E
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
<img src="http://xxx.com/yyy.png" onerror="alert('XSS')">
<div style="height:expression(alert('XSS'),1)" />(這個僅限 IE 有效)
使用者可做一個網頁,試著用JavaScript把document.cookie當成參數丟過去,然後再把它記錄下來,這即是偷 cookie 。
XSS攻擊方法有:
偷 cookie 。
利用 iframe 或 frame 存取管理頁面或後台頁面。
利用 XMLHttpRequest 存取管理頁面或後台頁面。
實例
網路上的一些知名網站如Google、MySpace、Xuite以及無名小站等曾被發現到XSS漏洞。
程式設計方面
避免XSS的方法主要是將使用者所提供的內容進行過濾,許多語言都有提供對HTML的過濾:
PHP的htmlentities()或是htmlspecialchars()。
Python的cgi.escape()。
ASP的Server.HTMLEncode()。
ASP.NET的Server.HtmlEncode()或功能更強的Microsoft Anti-Cross Site Scripting Library
使用者方面
包括Internet Explorer、Mozilla Firefox在內的常用瀏覽器皆有關閉JavaScript的功能,但關閉未必是最好的方法,許多網站都會使用JavaScript語言。