术语
术语 | 解释 | 备注 |
---|---|---|
跨域 | 两个 URL 的“协议+主机名+端口”3者只要有一个不一致 | http://www.taobao.com/和https://www.taobao.com/ |
跨站 | 两个 URL 的 eTLD+1 不相同 | a.github.io 和 b.github.io |
eTLD | effective top level domain (有效顶级域名) | .com、.co.uk、.github.io |
eTLD+1 | 有效顶级域名+二级域名 | taobao.com |
- 有效顶级域名,注册于 Mozilla 维护的公共后缀列表(Public Suffix List)中 https://publicsuffix.org/list/public_suffix_list.dat
- a.taobao.com和 www.b.taobao.com 是同站,a.github.io 和 b.github.io 是跨站,github.io 在公共后缀列表里,但 taobao.com 不在公共后缀列表里
为什么要有同源策略
同源策略:
浏览器的同源策略是为了限制CSRF攻击,因为我们有些场景确实需要,访问不同域名下的资源,所以需要跨域。
同源策略(Same Origin Policy)是一种约定,它是浏览器最核心最基本的安全功能。所谓的同源是指域名、协议、端口相同。不同源的客户端脚本在没有明确授权的情况下是不允许读写其他网站的资源
如在www.baidu.com的网页下 去访问www.taobao.com 这样则形成了跨域 那么浏览器则会限制响应数据(注意 这里是指限制访问响应的数据 而不是限制访问),也就是拿不到响应的数据,csdn.net域下的页面脚本文件无法拿到baidu.com下的cookies信息
同源策略的限制:
- Cookie、LocalStorage 和 IndexDB 会话存储无法读取。
- DOM 无法获得。
- AJAX 请求不能发送。
同源策略作用:
防止恶意网页可以获取其他网站的本地数据。
防止恶意网站iframe其他网站的时候,获取数据。
防止恶意网站在自已网站有访问其他网站的权利,以免通过cookie免登,拿到数据。
为什么能防csrf
- 上文提到不同源无法对cookie里面的数据进行操作访问,为了防止csrf攻击可以让前端把cookie中写入的token放到请求头中每次请求都带过来,然后服务端再对请求头里面的token进行校验。
- 因为不同源钓鱼网站拿不到支付宝的cookie里的信息那么钓鱼网站自然不能在请求头上加token这样也很完美的解决了csrf攻击!
csrf攻击的特点
- 请求是跨域的,可以看出请求是从恶意网站上发出的
- 通过 img, script 等标签来发起一个 GET 请求,因为这些标签不受同源策略的限制
- 发出的请求是身份认证后的
Django中csrf token验证原理
问题引入
解答
-
django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,这样就能避免被 CSRF 攻击。
-
官方文档中说到,检验token时,只比较secret是否和cookie中的secret值一样,而不是比较整个token。oken字符串的前32位是salt, 后面是加密后的token, 通过salt能解密出唯一的secret。django会验证表单中的token和cookie中token是否能解出同样的secret,secret一样则本次请求合法。