怎么在瓶框架中实现CSRF保护

  介绍

怎么在瓶框架中实现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保护