Flask-WTFormsはCSRF保護を提供します。通常のHTMLフォームを使用する場合はうまく機能しますが、AJAXを使用する場合のプロセスはそれほど明確ではありません。フォームにファイルをアップロードし、AJAXでプロセスを2つに分割しました。ファイル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?
ドキュメントは 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)
}
}
})
お役に立てれば!
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加