WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
CSRF対策

CSRF対策

このエントリーをはてなブックマークに追加

「Formの開始」でも簡単に触れましたが、LaravelはCSRF*(クロスサイトリクエストフォージェリ)から、保護するためにForm::openメソッドの中に、予め隠しトークン*を自動的に生成するような仕様になっています。

また、{{Form::open()}}でフォームを開始していなくても、Form::token()メソッドで、後から隠しフィールドのトークンを生成することも出来ます。

CSRFフィルター

それでは、実際にこの隠しトークンはどのように使用するのでしょうか。Laravelでは、デフォルトでCSRFフィルターが作成されていますので、app/filters.phpのCSRFフィルターを見てみましょう。

Route::filter('csrf', function()
 {
 if (Session::token() != Input::get('_token'))
 {
 throw new Illuminate\Session\TokenMismatchException;
 }
 });
  • 3-6行目:セッションに保存されているトークンと受信した(フォームから送信されてきた)トークンが一致しなければ、例外をスローするようになっています。
  • つまり、送信データが正式なフォームから送信されたのかどうかを判断し、不正なフォームから送信されたデータを排除することが出来るのです。

CSRFフィルターの設置

CSRFフィルターをルーターに設置するには、Route::postメソッドの第2引数に配列で指定します。

Route::post('profile',['before'=>'csrf',function(){
 //ここにフィルター通過後のロジックを記述
 }]);

また、コントローラー内に設置するには、コントローラーのコンストラクターに記述します。

class UserController extends BaseController{
 public function __construct(){
 $this->beforeFilter('csrf',['on'=>'post']);
 }
}
  • 2行目:__constructのアンダーバーは2つです。
  • 3行目:beforeFilterメソッドで、csrfフィルターを適用しています。第2引数には、post時のみにフィルターを適用するように条件指定しています。
  • つまり、UserController内の全てのPOSTアクションは、CSRFフィルターを通過しなければ、実行できないようになっています。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です