CSRF防范介绍之二

一、前言

《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值。

CSRF防范介绍之二_第1张图片

注:应用程序app对象配置secret_key的值,然后需要导入CSRFProtect类并在初始化时关联app。

2、在转账页面表单中添加CSRF令牌。

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

CSRF防范介绍之二_第2张图片

注:如果是ajax请求,可以在http头上添加上X-CSRFToken 。

四、flask_wtf csrf源码解析

1、源代码文件 flask_wtf/csrf.py

CSRF防范介绍之二_第3张图片

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

2、校验

CSRF防范介绍之二_第4张图片

你可能感兴趣的:(不好归类,csrf,前端)