14.跨站请求伪造和跨站请求保护的实现
1.什么是跨站请求伪造
-
CSRF
全拼为Cross Site Request Forgery
,译为跨站请求伪造。 -
CSRF
指攻击者盗用了你的身份,以你的名义发送恶意请求。- 包括:以你名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账......
- 造成的问题:个人隐私泄露以及财产安全。
2.CSRF攻击原理
图中 Browse 是浏览器,WebServerA 是受信任网站/被攻击网站 A,WebServerB 是恶意网站/点
击网站 B。
- 一开始用户打开浏览器,访问受信任网站A,输入用户名和密码登陆请求网站A。
- 网站A验证用户信息,用户信息通过验证后,网站A产生Cookie信息并返回给浏览器。
- 用户登录网站A成功后,可以正常请求网站A。
- 用户未退出网站A之前,在同一浏览器中,打开一个tab访问网站B。
- 网站B看到有人访问后,他会返回一些攻击性代码。
- 浏览器在接受这些攻击性代码后,促使用户在知情的情况下,浏览器携带Cookie(包括sessionsId)信息,请求网站A。这种请求有可能更新密码,添加用户什么的操作。
从以上的CSRF攻击原理可以看出,要完成一次CSRF攻击,需要被攻击者完成两个步骤:
1.登录受信任的网站A,并在浏览器本地生成cookie
2.在不登出网站A的情况下,访问危险网站B
如果不满足以上两个条件中的一个,就不会受到 CSRF 的攻击,以下情况可能会导致 CSRF:
1.登录了一个网站后,打开一个 tab 页面并访问另外的网站。
2.关闭浏览器了后,本地的 Cookie 尚未过期,你上次的会话还没有已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了……)
3.如何防止CSRF攻击
解决办法:就是在表单中添加 from.csrf_token。
步骤
- 在客户端向后端请求界面数据的时候,后端会往响应中的 cookie 中设置 csrf_token 的值
- 在 Form 表单中添加一个隐藏的的字段,值也是 csrf_token
- 在用户点击提交的时候,会带上这两个值向后台发起请求
- 后端接受到请求,以会以下几件事件:
- 从 cookie中取出 csrf_token
- 从 表单数据中取出来隐藏的 csrf_token 的值
- 进行对比
- 如果比较之后两值一样,那么代表是正常的请求,如果没取到或者比较不一样,代表不是正常的请求,不执行下一步操作