FuelPHPのcsrf_autoloadはtrueに設定しよう!
FuelPHPには、security.csrf_autoload
という設定があります。この設定は、デフォルトはfalse
です。
何が言いたいのか?
この設定をtrue
にしよう!ということが言いたいわけです。
security.csrf_autoload
をtrue
にすると、POST、PUT、DELETEメソッドでのすべてのリクエストで自動的にCSRF保護のトークンチェックが行われるようになります。
trueにするとどうなるのか?
トークンがなかったり、マッチしない場合は、以下のエラー(例外)になります。
Fuel\Core\SecurityException [ Error ]:
CSRF validation failed, Possible hacking attempt detected!
つまり、自動チェックにすればCSRF対策の漏れがなくなります(GETで重要な処理をするような行儀の悪いアプリの場合はダメですが)。
ただし、フォームなどへのトークンの埋め込みは自分でやる必要があります。 まあ、自動チェックでないCSRF対策の場合と同じです。
Fieldsetクラスを使っている場合は、
$fieldset->form()->add_csrf();
とすればOKです。
弊害としては、本来CSRF保護が必要ないフォームなどでも必ずトークンを付ける必要があるということと、もしCSRF保護をしたくない処理があった場合でも特定の処理だけオフにすることができないことです。
この自動チェックはFuelPHP起動のかなり初期に(Securityクラスがロードされたときに)実行されるため、イベントで特定のページだけ設定値を変更するようなこともできません。
どうしても一部だけオフにしたい場合は、Coreに手を入れるしかないように思います。
なんでこんなことを言い出したのか?
CSRF対策が漏れていたり、まったくないアプリが結構世の中にあることがわかったからです。どうも私が思っていたより、この世界ではCSRF対策がされていないようです。
フレームワークにCSRF保護の仕組みがあっても(ほとんどのフレームワークにあると思います)、そもそもまったく使ってないようなアプリもGitHubを探せばいろいろと出てくるようです。
あと、自分でアプリを完全に管理して、重要アクションを完全に把握して、必要な処理にCSRF対策を入れるという場合以外では、やっぱり漏れや忘れが起こりそうです。
ということで、今はCSRF保護をデフォルト(自動)にする方がよいと思っています。
関連
Date: 2014/12/21