描述一下csrf原理

1.用户浏览器登录信任网站       a

2.产生a的cookie存放在用户浏览器中

3.此时用户在未登出的情况下访问危险网站B

4,用户不小心点击了危险网站B 的链接,要求访问第三方站点A

5。用户浏览器带着2处产生的cookie访问A

6,A不知道请求时用户发出的还是B发出的,所以A 会执行5发出的操作,这样攻击者盗用了用户的身份,发出恶意请求


CSRF防御措施

 CSRF之所以成功,因为黑客完全可以伪造用户的请求,该请求所有的用户验证信息都存在于cookie中,黑客可以利用用户的cookie来通过验证。要抵御CSRF关键在于请求中不可以放入黑客所知道的信息,并且该信息不存在cookie中,可以在http请求中以参数形式加入一个随机的token,并在服务器建立一个拦截器来验证这个token,如果请求中没有token则认为是csrf攻击从而拒绝该请求。token可以在用户登陆之后产生并放于session,

然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。对于 GET 请求,token 将附在请求地址之后,这样 URL 就变成 http://url?csrftoken=tokenvalue。 而对于 POST 请求来说,要在 form 的最后加上 <input type=”hidden” name=”csrftoken” value=”tokenvalue”/>,这样就把 token 以参数的形式加入请求了。但是,在一个网站中,可以接受请求的地方非常多,要对于每一个请求都加上 token 是很麻烦的,并且很容易漏掉,通常使用的方法就是在每次页面加载时,使用 javascript 遍历整个 dom 树,对于 dom 中所有的 a 和 form 标签后加入 token。这样可以解决大部分的请求,但是对于在页面加载之后动态生成的 html 代码,这种方法就没有作用,还需要程序员在编码时手动添加 token。


django建议使用django.middleware.csrf.CsrfViewMiddleware进行全局控制,不提倡使用@csrf_protect进行单view控制,因为这样可能会有遗漏。如果不想进行csrf保护的view可以加上@csrf_exempt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值