跨網站指令碼
维基百科,自由的百科全书
跨網站指令碼(Cross-site scripting,通常簡稱為XSS)是一種網站應用程式的安全漏洞攻擊,允許惡意使用者將程式碼注入到網頁上,其他使用者在觀看網頁時就會受到影響。這類攻擊通常包含了HTML以及使用者端腳本語言。
目录 |
[编辑] 背景
當網景(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語言。反過來說,一個經常都有更新推出以供使用者更新的瀏覽器,在使用上會比一個月才會更新一次的來得較安心。

