參考 www.jianshu.com/p/2d9da4490…javascript
XSS攻擊一般指的是經過利用網頁開發時留下的漏洞,經過巧妙的方法注入惡意指令代碼到網頁,使用戶加載並執行攻擊者惡意製造的網頁程序。這些惡意網頁程序一般是JavaScript,但實際上也能夠包括Java、 VBScript、ActiveX、 Flash 或者甚至是普通的HTML。攻擊成功後,攻擊者可能獲得包括但不限於更高的權限(如執行一些操做)、私密網頁內容、會話和cookie等各類內容。java
HTML是一種超文本標記語言,經過將一些字符特殊地對待來區別文本和標記,例如,小於符號(<)被看做是HTML標籤的開始,
<input type="text" value="<%= escapeHTML(getParameter("keyword")) %>">
<button>搜索</button>
<div>
您搜索的關鍵詞是:<%= escapeHTML(getParameter("keyword")) %>
</div>
複製代碼
通過了轉義函數的處理後,最終瀏覽器接收到的響應爲:瀏覽器
<input type="text" value=""><script>alert('XSS');</script>">
<button>搜索</button>
<div>
您搜索的關鍵詞是:"><script>alert('XSS');</script>
</div>
複製代碼
<a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳轉...</a>
複製代碼
這段代碼,當攻擊 URL 爲http://xxx/?redirect_to=javascript:alert('XSS'),服務端響應就成了:安全
<a href="javascript:alert('XSS')">跳轉...</a>
複製代碼
雖然代碼不會當即執行,但一旦用戶點擊 a 標籤時,瀏覽器會就會彈出「XSS」。bash
// 根據項目狀況進行過濾,禁止掉 "javascript:" 連接、非法 scheme 等
allowSchemes = ["http", "https"];
valid = isValid(getParameter("redirect_to"), allowSchemes);
if (valid) {
<a href="<%= escapeHTML(getParameter("redirect_to"))%>">
跳轉...
</a>
} else {
<a href="/404">
跳轉...
</a>
}
複製代碼
把一個數據經過 JSON 的方式內聯到 HTML 中:cookie
<script>
var initData = <%= data.toJSON() %>
</script>
複製代碼
插入 JSON 的地方不能使用 escapeHTML(),由於轉義 " 後,JSON 格式會被破壞。 但安全組又發現有漏洞,原來這樣內聯 JSON 也是不安全的:函數
因而咱們又要實現一個 escapeEmbedJSON() 函數,對內聯 JSON 進行轉義。 轉義規則以下:ui
修復後的代碼以下:url
<script>
var initData = <%= escapeEmbedJSON(data.toJSON()) %>
複製代碼
總之,若是開發者沒有將用戶輸入的文本進行合適的過濾,就貿然插入到 HTML 中,這很容易形成注入漏洞。攻擊者能夠利用漏洞,構造出惡意的代碼指令,進而利用惡意代碼危害數據安全。
插入 JSON 的地方不能使用 escapeHTML(),由於轉義 " 後,JSON 格式會被破壞。 但安全組又發現有漏洞,原來這樣內聯 JSON 也是不安全的:
當 JSON 中包含 U+2028 或 U+2029 這兩個字符時,不能做爲 JavaScript 的字面量使用,不然會拋出語法錯誤。 當 JSON 中包含字符串 時,當前的 script 標籤將會被閉合,後面的字符串內容瀏覽器會按照 HTML 進行解析;經過增長下一個