一、前言
《CSRF防范介绍之一》我们介绍了使用Flask搭建CSRF攻击的钓鱼网站,主要是利用Form表单能跨域提交获取cookie值的漏洞,这节我们再来介绍一下使用Flask_wtf的自带的一套CSRF防护体系。
二、CSRF防范原理
最基础防护方法的是检测Refer值,但Refer值是极其容易被伪造,一般采用随机生成Token的方式来防范,逻辑如下,这个与你的代码是哪一门语言没有关系。
1、后端生成一个token存放在session或redis中。
2、将token返回给前端。
3、前端表单提交时携带上该token。
4、后端校验提交的token和自己生成的token是否相同,如相同则放行,否则认为是伪造请求,拒绝服务。
三、Flask_WTF CSRF
我们对《CSRF防范介绍之一》 的网站转账模块进行改造,使用flask_wtf重构一下代码。
Flask_WTF集成了WTForms,并带有 csrf 令牌的安全表单和全局的 csrf 保护的功能。
pip install flask_wtf
1、设置应用程序secret_key用于加密生成的csrf_token值。

注:应用程序app对象配置secret_key的值,然后需要导入CSRFProtect类并在初始化时关联app。
2、在转账页面表单中添加CSRF令牌。

启动应用后,这时你登录了正常网站A,然后又点击了恶意网站B 【领取优惠券】按纽后,会报提交请求失败。

注:如果是ajax请求,可以在http头上添加上X-CSRFToken 。
四、flask_wtf csrf源码解析
1、源代码文件 flask_wtf/csrf.py

注:生成一个随机字符进行sha1加密后,将其存放在session中,并与应用配置的secret_key进行序列化后生成token,最后将token设置到g中(g是单次请求全局变量,这样表单页面就可以直接引用)。
2、校验

本文介绍了CSRF防范原理,重点讲解了如何在Flask应用中使用Flask_WTF库进行CSRF防护,包括设置secret_key、生成和验证token,以及在AJAX请求中的处理方式。并通过源码解析展示了加密和存储过程。

1596

被折叠的 条评论
为什么被折叠?



