FuelPHPはSecurityクラスにCSRF対策に便利な関数が用意されています。CSRF対策の備忘録です。

config.phpの確認

config.php内の

'security' => array(
//中略
    'csrf_autoload'    => false,
    'csrf_token_key'   => 'fuel_csrf_token',
    'csrf_expiration'  => 0,
//中略
);

がコメントアウトされていないことを確認します。たぶん、最新版をダウンロードしている人は最初からコメントアウトされていないと思いますが、古いバージョンではこの部分がコメントアウトされているようです。

トークンの作成

ControllerからViewに引き渡す変数の配列を$dataとするとき、次のようにトークンを作ってやります。

$data['token_key'] = Config::get('security.csrf_token_key');
$data['token'] = Security::fetch_token();

Config::get('security.csrf_token_key')はさっきconfigで指定したfuel_csrf_tokenが入ります。この名前を変えたいときには、configcsrf_token_keyを変更しましょう。Security::fetch_token()で実際のトークンを生成します。

Viewでhiddenフィールドを作成

Viewのformタグの間に、

<?php echo Form::hidden($token_key, $token); >

を入れます。

トークンをチェックする

コントローラ内で次のように記述します。

if(Security::check_token()){
    //正しいポストのときの処理
}else{
    //不正なポストのときの処理
}

これで、正しいポストの時にDBに保存して、不正なポストの時にはエラーを返すという処理が可能になります。

こういう関数が予め用意されてるのは便利ですね。フレームワークを使うメリットを感じます。