2011年2月20日日曜日

Rails 3.0.4 と csrf

Rails がセキュリティアップデートされてました。最新版は 3.0.4 です。詳しいことは「こちら」へ。

元記事にもある通り CSRF や SQL Injection など非常にヤバい単語が並べられているので則アップデートしたものの、Ajax系の動作がうまく動かなくなり(link_to :remote でGET以外のリクエストをAjax経由で送るとセッションがクリアされてしまう)、頭を抱えていたところ、はたと rails.js に原因があるのではないかと思い立って jquery-rails をアップデートしてみたところ、ビンゴだったので詳細を記録。

ちなみに CSRF はクロスサイトリクエストフォージェリ(Cross site request forgeries)の略記で、外部からの意図しないリクエストによってWebサービスの動作を改竄する攻撃手段のひとつ。らしいです、Wikipediaによると。

SQL Injection は、フォームの内容に SQL 文を埋め込むことでサーバのデータを改竄する、これも攻撃手段のひとつですね。

Railsでは app/views/layouts/application.html.erb<head> タグ内に <%= csrf_meta_tag -%> を埋め込むことでワンタイムトークンを生成し、フォームの送信時に透過的にこれを hidden パラメータとして送信することで外部からの無作為なデータの送信を防ぐ(ことを自動的にやってくれる)わけで、トークンが合致しない場合は InvalidAuthenticityToken 例外が投げられていたのですが、今回は Java や Flash などのリクエストで同じことをやろうとしたときに、なぜだか忘れましたがとにかく例外を投げるだけではよくないらしいです。ので、セッションをクリアすることにしたんだそうで。

SQL Injection については、ActiveRecordlimit に脆弱性があったらしいです。「limitなんて数字だけじゃん」とついつい思ってしまいますが、攻撃する側も防御する側もよく気付くなぁ…と感心してしまいます。そんな悠長な事態じゃないんですけど。

で、肝心の対策。

ボクは jquery-rails を使っているので、

$ sudo gem update jquery-rails
$ rails generate jquery:install

こうして jquery.js, jquery.min.js, rails.js を上書きして事無きを得ました。 rails.js だけでいいのかなと思ったけれど、それでまた動かなかったら嫌なので jquery ライブラリも上書きしてしまいますた。多分バージョンが違うだけだと思うけど(「だけ」ってレベルじゃねーですけど)、jQueryで本格的に開発してる人にはオススメしません。あでも、jsUnitとか使ってるのかしら。いいのかしら。

そんなわけでした。

--

0 件のコメント:

コメントを投稿