XSS
Cross Site Scripting
跨站腳本


Scripting 能干啥?
- 獲取頁面資料----偷取網站任意資料資料
- 獲取 cookies----偷取用戶資料
- 劫持前端邏輯----偷取用戶密碼和登錄狀態
- 發送請求---欺騙用戶
- ....
Xss 攻擊分類
- 反射性
- url 引數直接注入
- 存盤性
- 存盤到 DB 后讀取時注入
XSS 攻擊注入點
- HTML 節點內容
<div>
#{content}
</div>
<div>
<div>
<script></script>
</div>
</div>
- HTML 屬性
<img src=https://www.cnblogs.com/ygjzs/p/"#{image}" />
- JavaScript 代碼
<script>
var data = https://www.cnblogs.com/ygjzs/p/"#{data}";
var data = "hello;alert(1);"";
</script>
- 富文本
- 富文本保留 HTML
- HTML 有 XSS 攻擊的風險
防御機制
- 瀏覽器自帶有防御機制,但很弱
ctx.set('X-XSS-Protection',1)//默認開啟瀏覽器防護
- html 節點內容
- 對字串進行轉義處理
- 轉義
< <和> >
var escapeHtml = function(str) {
if (!str) return "";
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
return str;
};
- HTML 屬性
- 轉義
"&quto;
- 轉義
var escapeHtmlProerty = function(str) {
if (!str) return "";
str = str.replace(/"/g, "&quto");
str = str.replace(/'/g, "'");
str = str.replace(/ /g, " ");
return str;
};
對&進行轉義,要放在前面str = str.replace(/&/g, "&");
- JavaScript 代碼
var escapeForJs = function(str) {
if (!str) return "";
str = str.replace(/\\/g, "\\\\");
str = str.replace(/"/g, '\\"');
return str;
};
也可以這也樣處理,轉為 json 格式:
forForJs: JSON.stringfy(ctx.query.from)
對\進行轉義,要放在前面
- 富文本
- 按黑名單過濾標簽和屬性
var xssFilter = function(html) {
if (!html) return "";
html = html.replace(/<\s*\/?script\s*>/g, "");
html = html.replace(/javascript:[^'"]/g, "");
html = html.replace(/onerror\s*=\s[^'"]?[^'"]*['"]?>/g, "");
return html;
};
- 按白名單保留部分標簽和屬性(要優于黑名單)
- 可以使用第三方插件
cheerioREADME - 運行
npm install cheerio - 該插件有自己的語法
- 可以使用第三方插件
var xssFilter = function(html) {
if (!html) return "";
var cheerio = require("cheerio");
var $ = cheerio.load(html);
// 白名單
var whiteList = {
img: ["src"]
};
$("*").each(function(index, elem) {
console.log("this is elem", elem); //在終端列印DOM樹結構
if (!switchList[elem.name]) {
$(elem).remove();
return;
}
for (var attr in elem.attribs) {
if (whiteList[elem.name].indexOf(attr) === -1) {
$(elem).attr(attr, null);
}
}
});
console.log(html, $.html());
};
還可以使用第三方插件xss,這樣就不用了自己配置白名單了,當然這個插件肯定也允許用戶自己定義白名單,運行npm install xss,該插件有自己的語法
var xssFilter = function(html) {
if (!html) return "";
var xss = require("xss");
var ret = xss(html, {
whiteList: {
img: ["src"],
a: ["herf"],
font: ["size", "color"]
},
onIgnoreTag: function() {
return "";
}
});
console.log(html, $.html());
return ret;
};
CSP
CSP 指的是內容安全策略,為了緩解很大一部分潛在的跨站腳本問題,瀏覽器的擴展程式系統引入了內容安全策略(CSP)的一般概念,這將引入一些相當嚴格的策略,會使擴展程式在默認情況下更加安全,開發者可以創建并強制應用一些規則,管理網站允許加載的內容
- Content Security Policy
- 內容安全策略
- 用于指定哪些內容可執行
- 添加在頭部

ctx.set(Content-Security-Policy, default-src 'self')
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/3942.html
標籤:訊息安全
下一篇:CSRF攻擊與防御
