CSRF(跨域请求伪造)
恶意网站以正常用户为媒介,通过模拟正常用户的操作,攻击其登录过的网站。
原理:
1. 正常用户登录后,获得正常站点的令牌,以cookie的形式保存。
2. 用户访问恶意站点,恶意站点通过某种形式去请求了正常网站,然后将用户的令牌传递到正常网站,完成攻击。
防御
cookie的sameSite
现在很多浏览器都支持禁止跨域携带cookie。需要设置cookie的sameSite为:
- Strict:严格,所有跨站请求都不附带cookie,有时会导致用户体验不好
- Lax:宽松,所有跨站的超链接、GET请求的表单、预加载连接时会发送cookie,其他情况不发送
- None:无限制
这种方法非常简单,极其有效,但前提条件是:用户不能使用太旧的浏览器。
验证referer和Origin
页面中的二次请求都会附带referer或Origin请求头,向服务器表示该请求来自于哪个源或页面,服务器可以通过这个头进行验证。
但某些浏览器的referer是可以被用户禁止的,尽管这种情况极少
二次验证
当做出敏感操作时,进行二次验证
使用非cookie令牌
这种做法是要求每次请求需要在请求体或请求头中附带token
请求的时候:authorization: token
XSS(跨域脚本攻击)
存储型XSS
-
恶意用户提交了恶意内容到服务器
-
服务器没有识别,保存了恶意内容到数据库
-
正常用户访问服务器
-
服务器在不知情的情况下,给予了之前的恶意内容,让正常用户遭到攻击
比如提交了一段
或者获取cookie然后发送到自己的服务器
对于存储型的防御:进行过滤然后html编码 将’<’ 变为 ‘<’ ‘>’ 变为’>’
反射型
- 恶意用户分享了一个正常网站的链接,链接中的地址带有恶意内容
- 正常用户点击了该链接
- 服务器在不知情的情况,把链接的恶意内容读取了出来,放进了页面中,让正常用户遭到攻击
DOM型
- 恶意用户通过任何方式,向服务器中注入了一些dom元素,从而影响了服务器的dom结构
- 普通用户访问时,运行的是服务器的正常js代码