原文地址:Web 漏洞分析與防護之 XSS(一)
博客地址:www.extlight.comhtml
跨站腳本攻擊(Cross Site Scripting)前端
經過在網站中的輸入框寫入 script 腳本或引入 script 文件,若是網站未過濾輸入內容,將會解析該腳本。git
若是腳本的功能是獲取網站的 cookie,cookie 中又保留一些敏感信息,則後果有可能很嚴重。github
反射型攻擊:腳本看成 url 的參數進行注入執行瀏覽器
存儲型攻擊:腳本被存儲到 DB 後,讀取時被解析執行bash
頁面代碼:cookie
<div>${content}</div>複製代碼
content 的內容爲 <script>alert(1)</script>,腳本攻擊後,會變成:xss
<div><script>alert(1)</script></div>複製代碼
頁面將會執行 alert(1)。工具
頁面代碼:網站
<img src="${imgSrc}" />複製代碼
imgSrc 的內容爲 2" onerror="alert(2),腳本攻擊後,會變成:
<img src="2" onerror="alert(2)" />複製代碼
頁面將會執行 alert(2)。
<script>
var mydata = "${data}";
</script>複製代碼
data 的內容爲 hello";alert(3);",腳本攻擊後,會變成:
<script>
var mydata = "hello";alert(3);"";
</script>複製代碼
頁面將會執行 alert(3)。
富文本須要保留 HTML 文本,HTML 文本中就有 XSS 攻擊的風險。
瀏覽器自帶一些防護能力,但只能防護 XSS 反射類型攻擊,且只能防護上文描述的前二個注入點。
防護手段原理也很簡單,就是將可能會執行腳本的標籤或屬性進行轉義和過濾。
將 < 和 > 轉義成 <; 和 >;。
將 " 轉義成 &quto;。
將 " 轉義成 \「 。
使用白名單保留部分標籤和屬性。
須要前端第三方工具:cheerio。
案例:
function xssFilter(html) {
var cheerio = require("cheerio");
var $ = cheerio.load(html);
// 白名單列表,key:標籤,value:屬性
var whiteList = {
"img":["src"],
"a":["href"],
"font":["color","size"]
};
// html 的遍歷全部元素
$("*").each(function(index,elem) {
// 刪除不在白名單的標籤
if (!whiteList[elem.name]) {
$(elem).remove();
return;
}
// 刪除不在白名單的標籤的屬性
for (var attr in elem.attribs) {
if (whiteList[elem.name].indexOf(attr) == -1) {
$(elem).attr(attr,null);
return;
}
}
});
return $.html();
}複製代碼
還有另外一種第三方工具,名字就叫 xss