Pyramidのセッション機能を使う(3)〜CSRF対策〜

PyramidのSessionFactoryを実装するさいにimplementが必要になるISessinインタフェースですが、ここではCSRF対策に関わる機能が規定されています。
CSRF対策に利用するトークンを発行する機能です。
=>トークンをどう使うかは実装者に委ねられています。当然ですが。

CSRFトークンの新規発行は以下のように行います。
token = request.session.new_csrf_token()

new_csrf_tokenメソッドによりトークンを発行します。
このとき、トークンがセッションに自動で格納されます。

発行済みのトークン取得するには以下のように、get_csrf_tokenメソッドを実行します。
token = request.session.get_csrf_token()

セッションに格納されている発行済トークンを取得します。
取得できなかった場合は、新規トークンを発行します。

トークンをチェックする関数も用意されています。
check_csrf_token関数をインポートします。

from pyramid.session import check_csrf_token

以下のように利用します。
第1引数はRequestオブジェクト、第2引数は、getまたはpostで送られてくるCSRFトークンのパラメータ名です。
セッションに格納されているトークンと、パラメータのトークンを比較して、
同じであればTrue、異なればFalseを返します。
check_csrf_token(request, 'csrf_token’)

CSRFトークンをクリアするメソッドはISessionインタフェースでは規定されていないので、セッションの値を直接削除するしかありません。
これはISessionを実装したクラスで、どのようにセッションに格納されているかによるので、実装を調べます。
ちなみに、UnencryptedCookieSessionFactoryでも、BeakerSessionFactoryでも、
セッションに格納されているキー値は、’_csrft_’ですので、
session[‘_csrft_’] = None;
のようにすればトークンを削除したことになります。

以上のように、CSRFトークンを発行する機能やチェックする機能はもっていますが、正しくCSRF対策を行うかどうかはアプリケーションの実装者に委ねられています。

ただ、ルーティングの際にadd_viewメソッドでcheck_csrfパラメータをTrueにしておくと、Pyramidフレームワークが自動でCSRFトークンをチェックしてくれるようなので、これを利用すればチェック処理の不用意な実装漏れなど防げるかもしれません。

セッション管理については、とりあえずここまで。
次回はPyramidの認証機構について見てみます。