什么是xss攻击
XSS 跨站脚本攻击,用户注入恶意的代码,浏览器和服务器没有对用户的输入进行过滤,导致用户注入的脚本嵌入到了页面中。由于浏览器无法识别这些恶意代码正常解析执行,攻击者的恶意操作被成功执行,比如可以获取用户的cookie数据然后发送给自己或者冒充正常用户向被攻击的服务器发送请求。
xss攻击分类
- 反射型:攻击者构造一个带有恶意代码的url链接诱导正常用户点击,服务器接收到这个url对应的请求读取出其中的参数然后没有做过滤就拼接到Html页面发送给浏览器,浏览器解析执行
- 存储型: 攻击者将带有恶意代码的内容发送给服务器(比如在论坛上发帖),服务器没有做过滤就将内容存储到数据库中,下次再请求这个页面的时候服务器从数据库中读取出相关的内容拼接到html上,浏览器收到之后解析执行
- dom型:dom型xss主要和前端js有关,是前端js获取到用户的输入没有进行过滤然后拼接到html中
防范措施
- 使用 encodeURIComponent 对url中的参数进行编码(反射型xss)
- 对用户的输入进行过滤(适用于所有类型的xss攻击)
下面是一个简易版对用户的输入进行过滤的方法:
function escapeHTML(str) {
str.replace(/[<>& "]/g, function(match) {
switch (match) {
case '<':
return '<';
case '>':
return '>';
case '&':
return '&';
case ' ':
return ' ';
case '"':
return '"';
}
});
}
- 对用户的输入使用 innerText 或者 textContent 进行设置,而不是使用 innerHTML 或者 outerHTML 进行设置;
- 服务器端设置 cookie 为 httpOnly 让前端无法通过js获取到用户的 cookie;
- 关键请求使用验证码,比如转账请求,避免恶意脚本发送这些关键请求;