csrf与xss攻击
CSRF
基本概念
Cross-site request forgery:跨站请求伪造
原理
角色:用户C、网站A、恶意网站B
在用户C信任网站A并产生Cookie后
用户在没有登出A网站的情况下访问危险网站B
B要求访问第三方站点A,发出一个请求
由于不知道这个请求是用户发出的还是B发出的,浏览器会自动带上用户C的cookie,所以A会根据用户的权限来处理5的请求,这样用户B就达到了模拟用户操作的目的
完成CSRF攻击,需要满足两个必要条件:
1.登录收信人网站A,并在本地生成Cookie
2.在不登出A的情况下,访问危险网站B(利用A的漏洞)
cookie保证了用户的登录状态,但是网站B并不能拿到cookie,只能伪造成用户
如何防御
- Token验证
- 服务器发送给客户端一个token
- 客户端提交的表单中带着这个token
- 如果这个token不合法,那么服务器拒绝这个请求
- 隐藏令牌
- 把token隐藏在http的head头中
- Referer验证
- Referer指的是页面请求来源。意思是,只接受本站的请求,服务器才做响应;如果不是,就拦截
XSS
基本概念
XSS(Cross Site Scripting):跨域脚本攻击
原理
不需要做任何的登录认证,它会通过合法的操作(比如在url中输入、在评论框中输入),向你的页面注入脚本(可能是js、html代码块等)
导致的结果:盗用Cookie破坏页面的正常结构,插入广告或恶意跳转等
攻击方式
1.反射型
发出请求时,XSS代码出现在url中,作为输入提交到服务器段,服务器解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。
例如:
1 |
|
2.存储型
存储型XSS和反射型XSS的差别在于:提交的代码会存储在服务器端(数据库、内存、文件系统等),下次请求目标页面时不用再提交XSS代码
例如:在留言内容中插入恶意脚本,由于服务器要像每一个访客展示之前的留言内容,所以后面的访客自然会收到前面留言的恶意脚本而躺枪
防范措施
编码
像一些常见的符号,比如<>在输入的时候要对其进行转换编码,这样做浏览器就不会对该标签进行解释执行了,同时也不影响显示效果
过滤
对诸如<script>、<img>、<a>等标签进行过滤
限制
xss攻击往往需要较长的字符串,对于一些可以预期的输入可以限制长度强制阶段来进行防御
区别
- CSRF:需要用户先登录用户A,获取cookie。XSS:不需要登录
- CSRF:利用网站A本身的漏洞,去请求网站A的api,XSS:向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容