怎么在瓶框架中实现CSRF保护?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
为什么需要CSRF ?
Flask-WTF表单保护你免受CSRF威胁,你不需要有任何担心,尽管如此,如果你有不包含表单的视图,那么它们仍需要保护。
例如,由AJAX发送的帖子请求,然而它背后并没有表单。在Flask-WTF 0.9.0以前的版本你无法获得CSRF令牌。这是为什么我们要实现CSRF。
具体操作步骤
根据csrf_token校验原理,具体操作步骤有以下几步:
1。后端生成csrf_token的值,在前端请求登录或者注册界面的时候将值传给前端,传给前端的方式可能有以下两种:
在模板中从表的单中添加隐藏字段
将csrf_token使用饼干的方式传给前端
2。在前端发起请求时,在表单或者在请求头中带上指定的csrf_token
3。后端在接受到请求之后,取到前端发送过来的csrf_token,与第1步生成的csrf_token的值进行校验
4。如果校验对csrf_token一致,则代表是正常的请求,否则可能是伪造请求,不予通过
而在烧瓶中,CSRFProtect这个类专门只对指定应用进行csrf_token校验操作,所以开发者需要做以下几件事情:
生成csrf_token的值
将csrf_token的值传给前端浏览器
在前端请求时带上csrf_token值
实现
后端书写
为了能够让所有的视图函数受到CSRF保护,你需要开启CSRFProtect模块:
得到flask_wtf.csrf import CSRFProtect CsrfProtect (app)
像任何其它的烧瓶扩展一样,你可以惰性加载它:
得到flask_wtf.csrf import CsrfProtect 时间=csrf CsrfProtect () def create_app (): app 才能=,瓶(__name__) csrf.init_app才能(app)
注意
你需要为CSRF保护设置一个秘钥。通常下,同瓶应用的SECRET_KEY是一样的。
在表单添加保护
如果模板中存在表单,你不需要做任何事情。与之前一样:
& lt; form 方法=皃ost", action=?氨? ,,{{,form.csrf_token }} & lt;/form>
但是如果模板中没有表单,你需要一个CSRF令牌:
& lt; form 方法=皃ost", action=?氨? & lt;才能input 类型=癶idden", name=癱srf_token",价值=https://www.yisu.com/zixun/眥{csrf_token ()}} "/> 形式>
自定义错误响应和关闭保护
无论何时未通过CSRF验证,都会返回400响应。你可以自定义这个错误响应:
@csrf.error_handler def csrf_error(原因): return 才能;render_template (& # 39; csrf_error.html& # 39;,,原因=原因),,400年
我们强烈建议你对所有视图启用CSRF保护。但也提供了某些视图函数不需要保护的装饰器:
@csrf.exempt @app.route (& # 39;/foo # 39;,,方法=(& # 39;得到# 39;,,& # 39;文章# 39;)) def my_handler (): #,才能…… return 才能;& # 39;好# 39;
默认情况下你也可以在所有的视图中禁用CSRF保护,通过设置WTF_CSRF_CHECK_DEFAULT为False,仅仅当你需要的时候选择调用csrf.protect()。这也能够让你在检查CSRF令牌前做一些预先处理:
@app.before_request def check_csrf (): if 才能;not  is_oauth(请求): ,,,csrf.protect ()
ajax提交数据
不需要表单,通过ajax发送帖子请求成为可能.Flask0.9.0版本后这个功能变成可用的。
- <李>
假设你已经使用了CsrfProtect(应用程序),你可以通过{{csrf_token()}}获取CSRF
,令牌。这个方法在每个模板中都可以使用,你并不需要担心在没有表单时如何渲染CSRF令牌字段。
我们推荐的方式是在元标签中渲染CSRF令牌:
& lt; meta name=癱srf-token",内容=皗{,csrf_token(),}}“在
在脚本标签中渲染同样可行:
& lt; script 类型=拔谋?javascript"比; var 才能;csrftoken =,“{{, csrf_token (),}}, & lt;/script>
下面的例子采用了在元标签渲染的方式,在脚本中渲染会更简单,你无须担心没有相应的例子。
无论何时你发送AJAX POST请求,为其添加X-CSRFToken头:
var csrftoken =, $('元[name=csrf-token] & # 39;) .attr(“内容# 39; KaTeX parse 错误:,Expected & # 39;} & # 39;, got & # 39; eof # 39;, at 最终获得of 输入:,…| |选项跟踪)/信息技术(settings.type),,,, ! this.crossDomain), { xhr.setRequestHeader (“X-CSRFToken”, csrftoken) } } })怎么在瓶框架中实现CSRF保护