こちらの記事の続きです。
Flask-WTF: Formの入力項目のvalidationや、CSRF対策済みのFormを作るためのFlask拡張
$ pip install flask-wtf flask-bootstrap
Flask-WTFについて補足
-
いい感じのFormが簡単に作れる(formのhtml生成
wtf.quick_form(form)
、validationform.validate_on_submit()
) -
CSRF対策が簡単にできる
CSRFとは:
リクエスト強要(CSRF:Cross-site Request Forgery)とは、別のサイトに用意したコンテンツ上の罠のリンクを踏ませること等をきっかけとして、インターネットショッピングの最終決済や退会等Webアプリケーションの重要な処理を呼び出すようユーザを誘導する攻撃である。
ブラウザが正規の Webコンテンツにアクセスした際には毎回、セッションを維持するために所定の Cookie、Basic認証データあるいは Digest認証データがブラウザから Webサーバ宛に送出されるという性質を、この攻撃は悪用する。
CSRF対策:
ユーザ本人以外の者が捏造したコンテンツに基づいて発せられたHTTPリクエストを Webアプリが受け付けないようにすること。
他者が推定困難なランダム値を フォームのhiddenフィールドとして埋め込み送信し、フォームを返信させる
簡単な使い方 (Flask-Bootstrapも利用)
from flask import Flask
app = Flask(__name__)
app.config['SECRET_KEY'] = 'super secret' # CSRF対策でtokenの生成に必要
Formを作る
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import Required
Class NameForm(FlaskForm):
name = StringField('name:', validators=[Required()])
submit = SubmitField('Submit')
Viewを作る
{% import "bootstrap/wtf.html" as wtf %}
{{ wtf.quick_form(form) }}
Form Handlingの例:
@app.route('/', methods=['GET', 'POST'])
def index():
name = None
form = NameForm()
if form.validate_on_submit():
name = form.name.data
form.name.data = ''
return render_template('index.html', form=form, name=name)
- 実装例 (github repo)
- WTFFormについて(Flask 公式doc)