xss攻击和csrf/xsrf攻击
xss攻击
XSS(Cross Site Scripting), 跨站脚本攻击,是发生在目标用户的浏览器层面上,当渲染DOM树时发生了不在预期范围内的js代码执行时,可以被判定为发生了xss攻击
xss攻击的类别
- 反射型xss
非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。
简单的案例是,某网站有一个input框,输入内容后,将会在内面上呈现输入的内容,如果这里不对返回的数据进行解码和过滤等操作的话,如果我们在input中输入一段具有攻击性的代码片段
<img src="null" onerror='alert(document.cookie)' />
页面将会弹出当前本地部分的cookie信息
类似案例这样的,被称作反射型xss攻击
- 存储型 XSS
存储型XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等。),然后在下次请求页面的时候就不用带上XSS代码了。
这里典型的案例就是留言板,用户提交了一条包含xss代码的留言到数据库,当目标用户查询留言时,留言的内容就会从服务器解析之后加载,浏览器将xss代码做html和js进行解析,发生了xss攻击
- DOM XSS
DOM XSS攻击不同于反射型XSS和存储型XSS,DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的DOM解析。这完全是客户端的事情。
DOM XSS代码的攻击发生的可能在于我们编写JS代码造成的。我们知道eval语句有一个作用是将一段字符串转换为真正的JS语句,因此在JS中使用eval是很危险的事情,容易造成XSS攻击。避免使用eval语句。
test.addEventListener('click', function () {
var node = window.eval(txt.value)
window.alert(node)
}, false)
// txt中的代码如下
<img src='null' onerror='alert(123)' />
xss的防御
- 对用户输入的内容进行解析和过滤或编码
过滤有危险DOM节点,如script,img, link, style, iframe等等
- 对cookie做保护,设置httpOnly,防止客户端通过document.cookie读取cookie
csrf/xsrf攻击
CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF。攻击者将会盗用你的身份,以你的名义发送恶意请求
产生csrf攻击需要有两个步骤
- 登陆受信网站A,并且在本地生产对应的cookie
- 在不登出A的情况下,访问危险网站B
csrf攻击是源于web的隐式身份验证机制,web的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的
csrf攻击的防御
- 尽量少使用get请求
- 使用验证码
- Referer Check
- 使用token