CodeIgniter

CSRFとは?

クロスサイトリクエストフォージェリ - Wikipedia

クロスサイトリクエストフォージェリ(Cross site request forgeries, 略記:CSRF,またはXSRF)とは、WWW における攻撃手法の一つ。
具体例として、掲示板に意図しない書き込みをさせられたり、オンラインショップで買い物をさせられたりするなどの被害が起こる。

原理
攻撃の大まかな流れは以下の通り。
1. 攻撃者が、攻撃用の Web ページを作成して WWW 上に公開する。
(WWW上ででなくとも、未対策のHTMLメーラーにウェブページをHTMLメールとして送信するだけでもよい。)
2. 第三者が、攻撃用の Web ページにアクセスする。
3. 第三者は、攻撃者が用意した任意の HTTP リクエストを送信させられる。
4. 送信させられた HTTP リクエストによって、攻撃者の意図した操作が行われる。
(ここで「第三者」とは、被攻撃サイトに意図せずアクセスさせられると言う意味で用いている。)

対策
Webサイト管理者側
 
第三者が知り得ない情報をフォームに入力させる(あるいはフォームの hidden パラメータに設定しておく)というのが基本的な対策方針である。ここで利用する第三者が知り得ない情報は、推測されにくい文字列であり、かつ総当り攻撃に対して耐性がある必要がある。具体的には以下の方法が挙げられる。
 
認証情報を入力させる
 認証制の Web システムの場合、入力フォームにユーザIDとパスワードを含めるという方法がある。システムの利用者から見れば、既にログイン画面で認証を行っているため冗長な操作であるが、クロスサイトリクエストフォージェリの対策としては最も効果がある。
 
ワンタイムトークンを利用する
 入力フォームに、第三者に推測されにくい文字列を hidden パラメータとして指定しておき、フォームの情報を受け取る段階でそのパラメータの整合性をチェックするという方法である。そのパラメータが整合性のチェックでしか使われない一時的なデータであることが多いために「ワンタイムトークン」と呼ばれる。但し、第三者が知り得ない情報として有効である限りは、必ずしも「ワンタイム」である必要は無い。

ワンタイムチケットの有用性

ワンタイムチケット方式は、必ずしも万全というわけではない、という指摘があります。
高木浩光@自宅の日記 - CSRF対策に「ワンタイムトークン」方式を推奨しない理由, hiddenパラメタは漏れやすいのか?

画面遷移を完全に制御するのは自然な実装であるが、その実装はオーバースペックであるし、後からそのように変更するのは大変すぎる。

理想的な対策の一つとして、サーバーサイドで「ページ遷移」を制御する方法が提案されていました。
数あるPHPフレームワークの中だと、「Piece Framework」のように、ページ遷移を制御する機能(Piece Flow)を提供しているフレームワークもありますね!

とりあえず、何もCSRF対策をしないよりはマシなので、ここではワンタイムチケット方式で、CodeIgniterのCSRF対策をやってみましょう。

参考リンク

ワンタイムチケットの導入

CodeIgniter2.0以降のバージョンでは、自動的にワンタイムチケットを利用できる機能が追加されていました。

  1. CodeIgniterの設定ファイルで、「csrf_protection」をTRUEにする。
    application/config/config.php

    #code(php){{
    $config['csrf_protection'] = TRUE;
    }}

  2. そして、Formヘルパーのform_open()関数を使って、formタグを出力する。

たったこれだけで、formタグの直下にワンタイムチケットのコードが自動的に挿入され、ページ遷移をチェックをしてくれるとのこと。

ワォ~、超簡単ですね!(・∀・)


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-08-03 (水) 15:30:34