在flask当中,flask-wtf模块时携带csrf校验的,只是需要开启;
如果不开启校验就不需要校验,但是那样不安全。
Csrf是针对与post请求的跨域限制,get请求没有作用
csrf_token的开启

 

在flask中开启csrf保护

from flask_wtf.csrf import CsrfProtect
CsrfProtect(app)

csrf也支持惰性加载

from flask_wtf.csrf import CsrfProtect

csrf = CsrfProtect()

def create_app():
app = Flask(__name__)
csrf.init_app(app)

注意: csrf保护需要app设置盐 app.config["SECRET_KEY"]

使用表单提交请求添加验证方法:

在表单中添加csrf验证

方式一:
<form method="post" action="">
{{ form.csrf_token }}
</form>
方式二:(推荐)
<form method="post" action="/">
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
</form>

csrf不通过会返回400响应

你可以自定义返回的页面

@csrf.error_handler
def csrf_error(reason):
return render_template('csrf_error.html', reason=reason), 400

如果你想要某些路由不进行csrf验证,使用csrf.exempt放弃验证

@csrf.exempt
@app.route('/foo', methods=('GET', 'POST'))
def my_handler():
# ...
return 'ok'

使用ajax提交请求

方法一:

# 首先在html文件里面的head标签里面添加meta标签
<meta name="csrf-token" content="{{ csrf_token() }}">
# 然后在script里面使用jquery获取
<script type="text/javascript">
var csrftoken = $('meta[name=csrf-token]').attr('content')
$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
</script>

方法二:

<script type="text/javascript">
var csrftoken = "{{ csrf_token() }}"

$.ajaxSetup({
beforeSend: function(xhr, settings) {
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken)
}
}
})
</script>

 

1、首先在配置文件中开启CSRFProtect

Flask的csrf_token的用法_ajax
 

 

2、视图中实例化forms类

Flask的csrf_token的用法_post请求_02
 

 

3、前端使用csrf_token

Flask的csrf_token的用法_post请求_03
 

 

4、非flask自创的form表单即前端的form表单使用csrf_token的方式

Flask的csrf_token的用法_post请求_04
切记要在后面加括号
 

 

5、ajax的post请求中使用csrf_token

Flask的csrf_token的用法_flask_05
 

 

6、@csrf.exempt单个视图免除csrf_token校验

Flask的csrf_token的用法_ajax_06