「Railsでアップロードの進捗を表示させたいなぁ…」と思っていたところ、【Uploadify】というものが見付かりました。Flashこそ使えどjQueryのプラグインなので導入も簡単です。と思いきや手間取りまくったのでメモメモ(本当は jQuery-ui のプログレスバーを使うものがあったらいいなと思ったのだけれど、実装する勇気も知識もない)。
まず知らなかったのは、Flash経由でリクエストするとセッション情報が送られない、という事実。常識なのかも知れないけどFlashから遠い位置にいたんだから仕方ないよねっ!
で、作成しているアプリケーションは「ログインしてからでないとファイルをアップロードしちゃだめ」なので、当然セッション情報は無視できないのです。半日Google先生と相談してわかったのは、【flash_cookie_session】という、読んで字のごとくFlashからCookieとかセッション情報を送ってくれる gem があることでした。結論から言うと試したら動いたので、今回はこれを使って Uploadify を設置していきます。
Flashからのセッション情報送信をRackレベルで動作するミドルウェアとして手作業で実装するのが(検索した結果)メジャーのようでしたが、アプリケーションごとに書くのも「わざわざだなぁ」と思ったので、っていうかやってみたんだけど動かなかったので、今回は gem で解決です。
2011年2月23日水曜日
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 については、ActiveRecord の limit に脆弱性があったらしいです。「limitなんて数字だけじゃん」とついつい思ってしまいますが、攻撃する側も防御する側もよく気付くなぁ…と感心してしまいます。そんな悠長な事態じゃないんですけど。
で、肝心の対策。
ボクは jquery-rails を使っているので、
$ sudo gem update jquery-rails
$ rails generate jquery:install
こうして jquery.js, jquery.min.js, rails.js を上書きして事無きを得ました。 rails.js だけでいいのかなと思ったけれど、それでまた動かなかったら嫌なので jquery ライブラリも上書きしてしまいますた。多分バージョンが違うだけだと思うけど(「だけ」ってレベルじゃねーですけど)、jQueryで本格的に開発してる人にはオススメしません。あでも、jsUnitとか使ってるのかしら。いいのかしら。
そんなわけでした。
--
元記事にもある通り 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 については、ActiveRecord の limit に脆弱性があったらしいです。「limitなんて数字だけじゃん」とついつい思ってしまいますが、攻撃する側も防御する側もよく気付くなぁ…と感心してしまいます。そんな悠長な事態じゃないんですけど。
で、肝心の対策。
ボクは jquery-rails を使っているので、
$ sudo gem update jquery-rails
$ rails generate jquery:install
こうして jquery.js, jquery.min.js, rails.js を上書きして事無きを得ました。 rails.js だけでいいのかなと思ったけれど、それでまた動かなかったら嫌なので jquery ライブラリも上書きしてしまいますた。多分バージョンが違うだけだと思うけど(「だけ」ってレベルじゃねーですけど)、jQueryで本格的に開発してる人にはオススメしません。あでも、jsUnitとか使ってるのかしら。いいのかしら。
そんなわけでした。
--
登録:
投稿 (Atom)