环境介绍:
-
python+django
-
python+flask
python中的网站开发中的csrf机制
前端向服务器发起post请求,从cookies中获取一个csrf_token值,从请求体中重新获取一个csrf_token值,如果两个值相同,则表明csrf验证通过,如果两个值不同,则校验失败。会向前端返回一个状态码403的错误。
三个服务我们分别假设它的ip:
-
用户李某:192.168.1.1
-
-
黑客网站:192.169.1.3
-
用户李某打开浏览器,访问受信任网站bank,输入用户名和密码请求登录网站bank;
-
在用户信息通过验证后,网站bank产生Cookie信息并返回给浏览器,此时用户登录网站bank成功,可以正常发送请求到网站bank;
-
用户未退出网站bank之前,在同一浏览器中,打开一个TAB页访问黑客网站;
-
黑客网站接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点bank;
-
浏览器在接收到这些攻击性代码后,根据黑客网站的请求,在用户不知情的情况下携带Cookie信息,向网站bank发出请求。网站bank并不知道该请求其实是由黑客发起的,所以会根据用户李某的Cookie信息以李某的权限处理该请求,导致来自黑客的恶意代码被执行。
-
因此就有了token的产生:
-
CSRF 攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 cookie 中,因此黑客可以在不知道这些验证信息的情况下直接利用用户李某的 cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于 cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
-
Ps:
黑客是可以获取用户浏览器中的关于bank的cookies值但是无法知道这些信息,但是token值一般情况下是随机生成的,这个不确定性,导致黑客必须伪造,如何伪造黑客是不知的,再加上http/https请求中的同源策略,即相同ip,相同域名,相同端口,否则同源策略限制了不同源的网站互相操作资源,而黑客如果自己伪造token往往是不能通过bank网站的验证,因此这样就十分安全了