おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

CSRFについて

protect_from_forgery??

railsのApplicationControllerに

protect_from_forgery

という一文があり、よくわからないので調べてみた。

Protect a controller‘s actions from CSRF attacks by ensuring that all forms are coming from the current web application, not a forged link from another site.

http://api.rubyonrails.org/

protect_from_forgeryメソッドは、CSRFという攻撃から身を守るためのメソッドらしい。

CSRFってなんだろう?

ということでwikipediaで調べた。

全部訳すのはめんどくさいので、例だけ簡単に意訳すると

  1. Bobはある銀行サイトに、少し前にログインしており、クッキーの有効期限が切れていない
  2. Bobはmalloryのチャットフォーラムをブラウジングしている
  3. malloryは下記のようなメッセージをPOSTする。クッキーの有効期限が切れていないため、認証をすり抜け、Bobのお金がmalloryに振り込まれる
<img src="http://bank.example/withdraw?account=bob&amp;amount=1000000&amp;for=mallory">

とこんな感じのことをCSRFというらしい。

railsはどのようにしてCSRFから身を守っているんだろう?

This is done by embedding a token based on the session (which an attacker wouldn‘t know) in all forms and Ajax requests generated by Rails and then verifying the authenticity of that token in the controller. Only HTML/JavaScript requests are checked, so this will not protect your XML API (presumably you‘ll have a different authentication scheme there anyway). Also, GET requests are not protected as these should be indempotent anyway.

http://api.rubyonrails.org/

フォームやAJAX関連のリクエストのセッションに、認証用のトークンを埋め込んで、それで認証しているみたい。HTMLやjavascriptはOKだけど、XMLは対応してないっぽい。あとgetも対応してないっぽい。