rub*_*lex 11 python flask csrf-protection flask-wtforms
Flask-WTForms提供CSRF保护.使用普通HTML表单时效果很好,但使用AJAX时过程不太清楚.我的表单中有文件上传,我用AJAX将进程分成两部分:文件进入upload端点,而表单的其余部分进入submit端点.由于文件是使用AJAX发布的,因此它不会获得CSRF令牌,但我希望保护upload端点免受攻击.如何在使用AJAX时生成CSRF令牌?
@app.route('/submit', methods=["GET","POST"])
@login_required
def submit():
form = MyForm()
if request.method == "POST" and form.validate():
# success, csrf checks out and data is validated
# do stuff
csrf_for_uploads = # generate csrf?
return render_template('some_form.html', form=form, csrf_for_uploads=csrf_for_uploads)
@app.route('/upload', methods=["POST"])
@login_required
def upload():
myfile = request.files['file']
# How do I verify CSRF now?
Run Code Online (Sandbox Code Playgroud)
Mat*_*aly 18
该文件说一点关于与关于AJAX实现CSRF保护.
您可以启用该模块:
from flask_wtf.csrf import CsrfProtect
CsrfProtect(app)
Run Code Online (Sandbox Code Playgroud)
然后在你的AJAX POST调用中使用它:
<meta name="csrf-token" content="{{ csrf_token() }}">
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)
}
}
})
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助!