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/
CSRFってなんだろう?
ということでwikipediaで調べた。
全部訳すのはめんどくさいので、例だけ簡単に意訳すると
- Bobはある銀行サイトに、少し前にログインしており、クッキーの有効期限が切れていない
- Bobはmalloryのチャットフォーラムをブラウジングしている
- malloryは下記のようなメッセージをPOSTする。クッキーの有効期限が切れていないため、認証をすり抜け、Bobのお金がmalloryに振り込まれる
<img src="http://bank.example/withdraw?account=bob&amount=1000000&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も対応してないっぽい。