Laravel3 を WebMatrix3 で開発しロリポップで公開する no.12 【CSRF : Cross site request forgeries】

前回はフォームから送信された値を取得しヴァリデートを行うところまで実装しました。今回はポスト処理を実行する前に CSRF処理を追加しようと思います。

と言っても難しいことは特にありません。まずは signup.blade.php ビューテンプレートを確認しましょう。

{{ Form::open(\'signup\') }}

@if (Session::has(\'signup_errors\'))
<span class=\"error\">登録失敗</span>
@endif

<p>{{ Form::label(\'email\', \'メールアドレス\') }}</p>
<p>{{ Form::text(\'email\') }}</p>

<p>{{ Form::label(\'password\', \'パスワード\') }}</p>
<p>{{ Form::password(\'password\') }}</p>
<p>{{ Form::label(\'password_confirmation\', \'パスワード(確認用)\') }}</p>
<p>{{ Form::password(\'password_confirmation\') }}</p>

<p>{{ Form::submit(\'登録\') }}</p>

{{ Form::token(); }}

{{ Form::close() }}

フォームに token 出力が一行たされただけです。続いて signup.php コントローラを確認します。

<?php

class Signup_Controller extends Base_Controller
{
    public $restful = TRUE;

    public function __construct()
    {
        parent::__construct();
        $this->filter(\'before\', \'csrf\')->on(\'post\');
    }

    public function get_index()
    {
        return View::make(\'signup\');
    }

    public function post_index()
    {
        $rules = array(
            \'email\'    => \'required|email|unique:authentication\',
            \'password\' => \'required|confirmed\',
        );

        $v = Validator::make(Input::get(), $rules);
        if ($v->fails())
        {
            return Redirect::to(\'signup\')->with(\'signup_errors\', true);
        }
        else
        {
        }
    }
}

コンストラクタが追加になっています。追加された処理はフィルターと呼ばれる機能で、処理を登録しておくことで、コントローラーなどから呼び出すことができます。実行タイミングは2つで、メソッド処理の前と、後になります。今回は post 処理を実行する前に CSRF フィルターを実行したかったので第一引数に before 、第二引数に csrf が入力されています。

CSRF フィルターはデフォルトで登録済みのフィルターで、その他の登録済みのフィルターには auth (認証用)フィルターがあります。

filter メソッドにチェーンされている on メソッドは、HTTP メソッドのタイプによって処理の有無を切り替えるときに使います。今回は post 時にのみフィルターを書けたいので on メソッドに post を登録しました。

このまま試してみてもわからないので、signup.blade.php テンプレートファイルから token 出力の行を一旦削除してみましょう。その後、フォームの登録ボタンを押してみてください。 Laravel3 が提供する 500 エラーのページが出力されたら成功です。

この filter の処理内容は routes.php に書かれています。割りとしたの方にありますので探してみてください。送信されてくる token が正しくない場合に 500 エラーを出力しています。

確認できましたら テンプレートに削除した内容を戻し、今度はフォームの内容を正しく入力し、登録してみてください。真っ白な画面が表示されたら成功です。

それでは今回はここまで。

カテゴリー: Laravel3, Web, WebMatrix, ロリポップ タグ: , パーマリンク

コメントを残す

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