Python 如何在AJAX中使用CSRF保护?

Python 如何在AJAX中使用CSRF保护?,python,flask,flask-wtforms,csrf-protection,Python,Flask,Flask Wtforms,Csrf Protection,这些表格提供CSRF保护。它在使用普通HTML表单时效果很好,但在使用AJAX时,过程就不那么清晰了。我的表单中有一个文件上传,我使用AJAX将过程一分为二:文件转到upload端点,而表单的其余部分转到submit端点。由于该文件是用AJAX发布的,因此它没有获得CSRF令牌,但我想保护上传端点免受攻击。使用AJAX时如何生成CSRF令牌 @app.route('/submit', methods=["GET","POST"]) @login_required def submit():

这些表格提供CSRF保护。它在使用普通HTML表单时效果很好,但在使用AJAX时,过程就不那么清晰了。我的表单中有一个文件上传,我使用AJAX将过程一分为二:文件转到
upload
端点,而表单的其余部分转到
submit
端点。由于该文件是用AJAX发布的,因此它没有获得CSRF令牌,但我想保护
上传
端点免受攻击。使用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?
本文介绍了如何使用AJAX实现CSRF保护

您可以启用该模块:

from flask_wtf.csrf import CsrfProtect

CsrfProtect(app)
然后在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)
        }
    }
})

var csrftoken=$('meta[name=csrf-token]')。attr('content'))
$.ajaxSetup({
发送前:功能(xhr、设置){
if(!/^(获取| HEAD | OPTIONS | TRACE)$/i.test(settings.type)和&!this.crossDomain){
setRequestHeader(“X-CSRFToken”,CSRFToken)
}
}
})

希望这有帮助

嗯,我完全错过了那个文件。是的,这就差不多概括了。大家好,请注意:“FlaskWTFDeprecationWarning:“Flaskwtf.CsrfProtect”已重命名为“CsrfProtect”,并将在1.0中删除。“请有人解释一下”如果(!/^(GET | HEAD | OPTIONS | TRACE)$/i.test(settings.type)&!this.crossDomain)“意味着什么?谢谢此解决方案依赖于使用jinja呈现模板。有没有一种方法可以做到这一点?例如在响应中传递令牌?如何使用fetch API实现这一点?