波打際のブログさん

主に、プログラミング備忘録など。

Playframework2.1のCSRF対策

はじめに

 Playframework2.1では新機能としてCSRF対策が追加されたそうです。そもそもCSRF対策の機能はPlayframework1.x系には存在した機能ですが、2.0では機能そのものが消えていました。当然といえば当然の復活です。

 公式の新機能紹介( Highlights )にも New Filter API and CSRF protection と大きく取り上げています。

新機能紹介のページを読み進めていくと、

The filters project that is part of the standard Play distribution contain a set of standard filter, such as the CSRF providing automatic token management against the CSRF security issue.

http://www.playframework.com/documentation/2.1.x/Highlights

 素晴らしい!これでCSRF問題の苦悩から解放される・・・!と、感動すると同時にCSRFに関する説明はここで終わっていることに気づきます。

そうです、肝心なhow toや関連するリンクが一切ないのです!!

と、言うことで必死にぐぐって使えるようになったので結果をまとめておきます。

編集するファイル

project/build.scala

 filtersを依存関係に追加します。appDependenciesの部分を下記のように編集します。

val appDependencies = Seq(
	// Add your project dependencies here,
	javaCore,
	javaJdbc,
	javaEbean,
	filters //←この行を追加
)

app/Global.java

 アプリケーション全体の設定などを記述するGlobalクラスに、次のメソッドを追加します。Globalクラスは初期状態では存在しないので生成して、app直下(eclipse等では、default packages)に配置します。 Global.javaに関する詳しい記述は JavaGlobal を参照してください。

import play.*;
import play.api.mvc.EssentialFilter;
import play.filters.csrf.CSRFFilter;

public class Global extends GlobalSettings {

	@Override
	@SuppressWarnings({"rawtypes", "unchecked"})
	public <T extends EssentialFilter> Class<T>[] filters() {
		Class[] filters = {CSRFFilter.class};
		return filters;
	}

}

 filters()でCSRFFilterのクラスを返すことで、リクエストをインターセプトした際に、フィルターが呼び出されて処理が行われるみたいです。

使い方

 設定が終わったので、あとはフォームに設定を適用するだけで自動的にCSRF対策が行われます。具体的には helper関数を利用してフォームの宣言を行う際のactionに helper.CSRF関数を使用します。

@helper.form(action = helper.CSRF(routes.NyarukoController.postSanti)) {

}

こんなかんじです。