xss攻击流程
- 往网页里注入脚本代码
- 当用户访问时获取到包含恶意代码的网页
- 通过恶意脚本,坏人可获取和控制用户信息
攻击方式
- 反射形状(非持久形攻击) XSS
- 储存性(持久形攻击) xss
- Dom-based形 XSS
反射型 vs 持久型
非持久化 持久化
需要用户点击 不需要交互也可以触发
Dom-Based 型
基于浏览器Dom解析的攻击
1.反射型攻击流程
2.持久型攻击流程
3.Dom-Based 型攻击流程
反射型 vs Dom-Based 型攻击流程
相同之处 优势用户访问包含恶意代码的URL
不同之处 反射型需要服务端参与解析 Dome-Based 客户端参与解析
XSS防御策略
有些浏览器内置了XSS防御 把URL的恶意代码过滤了
1. httpOnly
禁止JS访问cooke
当收到XSS攻击时减少受到的伤害
2. 输入检查
判断输入格式是否正确 - 白名单
过滤危险字符 去除<script>,<javascript,onclick>等 - 黑名单 filter()
转义特殊字符 << >> - 黑名单 htmlEscape()
3. 输出检查
最后一道防线,根据不同的场景对数据进行处理
1. html htmlEncode()
2. javaScript javaScriptEncode()
3. URL 内置 EncodeURI
输出检查的方法
1. 转义html特殊字符
// 转义 html 特殊字符
function htmlEscape(str) {
return String(str)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
2.对富文本进行过滤处理
// 正则获取危险标签
var REGEXP_TAG = /<(script|style|iframe)[^<>]*?>.*?<\/\1>/ig;
// 正则获取危险标签属性
var REGEXP_ATTR_NAME = /(onerror|onclick)=([\"\']?)([^\"\'>]*?)\2/ig;
/**
* 过滤函数
* @param {String} str
*/
function filter(str) {
return String(str)
.replace(REGEXP_TAG, '')
.replace(REGEXP_ATTR_NAME, '');
}
输入检查的方法
1. 转义html特殊字符
// 转义 html 特殊字符
function htmlEncode(str){
return String(str)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '<')
.replace(/>/g, '>');
}
2. javaScript特殊字符进行转义
// 通常是使用"\"对特殊字符进行转义
function javaScriptEncode(str){
function encodeCharx(original){
var thecharchar = original.charAt(0);
switch(thecharchar){
case '\n':return "\\n"; break;
case '\r':return "\\r"; break;
case '\'':return "\\'"; break;
case '\"':return "\\x22"; break;
case '\&':return "\\&"; break;
case '\\':return "\\\\"; break;
case '\t':return "\\t"; break;
case '/':return "\\x2F"; break;
case '<':return "\\x3C"; break;
case '>':return "\\x3E"; break;
default: return thecharchar;
}
}
var preescape = str;
var escaped = "";
for(var i=0;i < preescape.length; i++){
escaped = escaped + encodeCharx(preescape.charAt(i));
}
return escaped;
}
3. URL特殊字符进行转义
浏览器内置 encodeURI()