2008-01-14 (Mon)
_ [Rails] CookieStoreとセキュリティ(2)
ちょっと気になるのが、サーバが一度発行したクッキーは、HMACで使用する鍵を変えたりしない限り、ずっと有効だということだ。悪意のある第三者がクッキーを盗聴してリプレイを試みる、というケースについては、盗聴できたという時点で他のセッションストアの場合もセッションハイジャックが可能になるので、CookieStoreがとりわけ危険だというわけではない。気になるのは、ユーザがセッションの状態を任意の時点に戻すことができる点だ。アプリケーションの作りによっては悪さができそうな気もするのだけれど、実際のところどうなのだろう。
[Cookieとセキュリティより引用]
と書いたけど、問題になりそうな具体例を思い付いた。
RailsによるアジャイルWebアプリケーション開発 のサンプルのショッピングカートアプリケーションでは、カートの格納先にセッションを使用しているが、選択された商品をカートに格納する際に商品の価格をコピーする。 *1 これは、商品の価格が変更されても、カートに入っている商品の価格はカートに入れた時点の価格のままにする、という仕様になっているためだ。
ここで問題となるのが、CookieStoreではいつでもセッションの状態を 任意の時点に戻すことができることだ。 カートの内容も当然その時点に戻るので、最安値の時のセッションデータ を保存しておいて後で使用すれば、いつでも最安値で商品を購入できてしまう。
対策は簡単で、カートの保存先をDBにすればよい。
まとめると、CookieStoreに格納すべきでないデータは、以下のようなデータだ。
- ユーザに知られてはまずいデータ
- アプリケーションの動作に重大な影響を及ぼし、状態が変わりうるデータ。
後者については「アプリケーションの動作に重大な影響を及ぼす」だけだと、ログインユーザのIDすら格納できなくなるので、「状態が変わりうる」という条件を追加しないと使いものにならない。 ユーザIDに対応するユーザ情報(管理権限があるか、いつまで有効か、など)は「状態が変わりうる」のでCookieStoreに格納してはいけない。 ユーザIDについても、欠番になったIDを再利用しているような場合では問題が発生する。
上記のような判断をきちんとできる自信のない人はCookieStoreを使わない方がよい。 幸いCookieStoreにはサイズの上限があるので、あまりセッションに情報を格納しないスタイルにプログラマを誘導できるかもしれない。
_ [Rails] CookieStoreの有効期限
以下のようにセッションの有効期限をサーバ側でチェックすることができる。
before_filter :check_session_lifetime
private
def check_session_lifetime
if session[:updated_at] &&
session[:updated_at] + 1.hour < Time.now
reset_session
# 実際にはユーザに適切なフィードバックを返す。
raise "session expired"
end
session[:updated_at] = Time.now
end
ただし、セッションに格納する情報に注意する必要があることには変わりない。
_ [Rails] Ruby on Rails の注文の多い料理店に入ってしまった話
Rails周りの不幸な出来事の原因はいろいろあると思うけど、その原因の一つはRailsプログラミング(あるいはRubyプログラミング・Webアプリケーションプログラミング)がその見かけほど簡単なものではないことだと思う。
Railsの見かけはどんどん簡単になっていく。scaffoldからpaginationが消えてすっきりしたり、MySQLをセットアップしなくてもSQLiteがデフォルトになってすぐに使えたり、CookieStoreがデフォルトになってセッションファイルでディスクを溢れさせるようなこともなくなった。 でも現実は厳しくて、何も考えずに「安心安全素敵」なWebアプリケーションができるわけもなく、さっきも書いたような罠があちこちに潜んでいる。 RubyもRailsも、もともと初心者が何も考えずにプログラムを書けるように作られているわけではない。 CやLispやJavaでもちゃんとしたプログラムが書ける人が、もっと楽にプログラミングできるように作られているだけだ。 見かけの簡単さにつられてプログラムを書きはじめた初心者の周りでは色々な問題が起こる。
でも本当の不幸の原因は、技術的なことよりも、平鍋さんの言葉を借りると「問題対私たち」という構図を作ることが難しいことにあるのではないかと思う。 毎日顔を合わせるチームのメンバの間でさえ「あなた対私」という構図に なりがちなのだから、会ったこともない人たちとコミュニケーションを取る場合はなおさらだ。 「それはお前がマヌケだからだよ!」と言いたくなることもある。 できる人・真面目な人ほど大変だろう。自分はダメな人間なので返事すら書かないことが多い。
とか書いてたら、Linuxとタコの話を思い出した。ぐぐったら生越さんの記事が出て来た。自分もこういう姿勢で人ではなく問題そのものに向き合えるようにしたい。 そのためには、場合によっては直接相手にしないことも適切な対応だろう。*2 スルー力という言葉は嫌いだけど。
あとは蛇足。
池上君は実は大学のクラスメートだった。でも在学中に話をする機会は少なかった。理由は池上君が現実逃避をしながらも無事卒業したのに対して、自分は バンド活動やRubyといった現実逃避に明け暮れたあげく、ついには数学科をドロップアウトしてしまったからだ。
文学部哲学科に変わったものの、一年留年して卒論をでっちあげて卒業した後、こうしてRubyを仕事にしてしまっている。今も現実逃避の真最中というわけ。ここまで来たら精一杯逃げ続けるしかない。
池上君も僕を見習ってもうちょっといい加減に生きたらいいと思うよ。 Rails 2.0ではCSRF対策のコードがデフォルトで入ったし、世界はちょっとずつマシになっている。
shugo さんの Ruby on Rails の注文の多い料理店に入ってしまった話 RubyもRailsも、もともと初心者が何も考えずにプログラムを書けるように作られているわけではない。 CやLispやJavaでもちゃんとしたプログラムが書ける人が、もっと楽にプログラミングできるように作られ
注文の多い料理店 に関する最新のブログ検索の結果をまとめて、口コミや評判、ショッピング情報を集めてみると…
- http://bloger.x0.com/result/パワプロ9 パスワード選手/パワプロ9 パス... ×196
- http://reader.livedoor.com/reader/ ×115
- http://arton.no-ip.info/diary/ ×93
- http://bloger.x0.com/result/パワポケ10/パワポケ10 最強パスワード ×91
- http://press.eek.jp/result/kreva/kreva 壁紙 ×55
- http://bloger.x0.com/result/パワポケ10/パワポケ10 裏ワザ ×49
- http://bloger.x0.com/result/パワプロ14/パワプロ14 最強選手 ×43
- http://bloger.x0.com/result/パワプロ14/パワプロ14 パワプロ14決定... ×39
- http://bloger.x0.com/result/パワプロポータブル2/パワプロポータブル2 ... ×35
- http://press.eek.jp/result/パワポケ10 パスワード/パワポケ10 パスワ... ×33
- http://press.eek.jp/result/パワプロポータブル2/パワプロポータブル2 パ... ×28
- http://press.eek.jp/result/パワプロ14/パワプロ14 パワプロ14 改造... ×26
- http://bloger.x0.com/result/パワプロ14/パワプロ14 最強選手 ×25
- http://bloger.x0.com/result/パワポケ10/パワポケ10 パス ×25
- http://arton.no-ip.info/diary/20080117.html ×25
- http://press.eek.jp/result/パワポケ10/パワポケ10 パスワード ×24
- http://bloger.x0.com/result/茂野/パワポケ10 茂野 ×23
- http://bloger.x0.com/result/パワプロ13/パワプロ13 選手パスワード ×23
- http://press.eek.jp/result/パワプロ14/パワプロ14 裏ワザ ×21
- http://bloger.x0.com/result/茂野/茂野 パワポケ10 ×20
- http://bloger.x0.com/result/パワプロ13/パワプロ13 パスワード選手 ×20
- http://bloger.x0.com/result/パワプロ13/パワプロ13 改造選手 ×18
- http://press.eek.jp/result/パワポケ10/パワポケ10 ×18
- http://bloger.x0.com/result/ゴッドファーザー/ゴッドファーザー 攻略 ×18
- http://press.eek.jp/result/茂野/茂野 ×17
- http://press.eek.jp/result/パワプロ14/パワプロ14 改造 ×16
- http://search.live.com/results.aspx?q=result ×15
- http://press.eek.jp/result/エルモ/エルモ 画 ×15
- http://ksearch.enq-g.info/result-83p-83-8F-83v-83-... ×14
- http://press.eek.jp/result/パワプロ9/パワプロ9 パスワード ×14
- http://press.eek.jp/result/パワプロ14/パワプロ14 最強選手パスワード... ×14
- http://d.hatena.ne.jp/yuum3/20080114/1200300054 ×14
- http://www.tyumoku.info/t-83p-83-8F-83v-83-8D14-20... ×13
- http://bloger.x0.com/result/パワポケ10/パワポケ10 最強選手パスワー... ×13
- http://bloger.x0.com/result/パワプロ13/パワプロ13 最強選手パスワー... ×12
- http://www.jitu.org/~tko/cgi-bin/bakanoemono.rb ×12
- http://bloger.x0.com/result/パワポケ10/パワポケ10 選手パスワード ×12
- http://arton.no-ip.info/diary/200801.html ×11
- http://bloger.x0.com/result/パワプロ9/パワプロ9 選手パスワード ×11
- http://bloger.x0.com/result/パワプロ14/パワプロ14 パスワード選手 ×11
- http://press.eek.jp/result/パワプロ14/パワプロ14 選手パスワード ×11
- http://fastladder.com/reader/ ×11
- http://bloger.x0.com/result/パワプロ9/パワプロ9 裏ワザ ×10
- http://bloger.x0.com/result/パワプロ12/パワプロ12 選手パスワード ×10
- http://bloger.x0.com/result/パワポケ9 コード/パワポケ9 コード ×9
- http://ksearch.enq-g.info/result-83p-83-8F-83v-83-... ×9
- http://bloger.x0.com/result/パワプロ12 最強パスワード/パワプロ12 ... ×9
- http://ksearch.enq-g.info/result-83p-83-8F-83v-83-... ×9
- http://bloger.x0.com/result/パワプロ9/パワプロ9 茂野 ×9
- http://bloger.x0.com/result/パワプロポータブル2/パワプロポータブル2 ... ×9
- http://press.eek.jp/result/パワプロ10/パワプロ10 パスワード ×8
- http://www.tyumoku.info/t-83p-83-8F-83v-83-8D14-20... ×8
- http://bloger.x0.com/result/第10回/第10回 介護支援専門員実務研修受... ×8
- http://bloger.x0.com/result/パワプロ13/パワプロ13 裏ワザ ×8
- http://bloger.x0.com/result/パワプロ9/パワプロ9 最強選手 ×8
- http://bloger.x0.com/result/パワプロ10/パワプロ10 最強パスワード ×8
- http://www.tyumoku.info/t-83p-83-8F-83-7C-83P10-20... ×7
- http://bloger.x0.com/result/パワプロポータブル2 最強選手パスワード/パ... ×7
- http://reader.livedoor.com/subscribe/http://shugo.... ×7
- http://press.eek.jp/result/カーテン仕切り/カーテン仕切り ×7
- http://www.tyumoku.info/t-83p-83-8F-83v-83-8D13-20... ×7
- http://bloger.x0.com/result/パワプロ14/パワプロ14 パスワード選手 ×7
- http://guideme.jp/ranksearch/パワプロ12 最強選手パスワー ×7
- http://d.hatena.ne.jp/yuum3/ ×7
- http://bloger.x0.com/result/パワプロ9/パワプロ9 パスワード ×7
- http://ksearch.enq-g.info/result-83p-83-8F-83v-83-... ×7
- http://www.tyumoku.info/t-83p-83-8F-83-7C-83P9-20-... ×6
- http://press.eek.jp/result/かわいい画像/かわいい画像 2008年 ×6
- http://bloger.x0.com/result/エルモ/エルモ 画嬢 ×6
- http://gridley.res.carleton.edu/~kubok/trend_list/... ×6
- http://bloger.x0.com/result/パワプロ12/パワプロ12 パスワード選手 ×6
- http://www.tyumoku.info/t-83p-83-8F-83-7C-83P10-20... ×6
- http://bloger.x0.com/result/パワプロポータブル2/パワプロポータブル2 ... ×6
- http://press.eek.jp/result/パワプロ12/パワプロ12 攻略 ×6
- http://bloger.x0.com/result/パワプロ14/パワプロ14決定版 ×6
- http://press.eek.jp/result/blog-search/やなぎまつたけ ×6
- http://bloger.x0.com/result/山本裕典/山本裕典 ファンレター ×6
- http://press.eek.jp/result/山田涼介/山田涼介 画嬢 ×6
- http://www.pop-wd.com/pop/パワプロ14 最強選手パスワード/ ×6
- http://bloger.x0.com/result/パワプロ13/パワプロ13 選手パス ×6
- http://press.eek.jp/result/パワプロ12/パワプロ12 最強パスワード ×6
- http://press.eek.jp/result/パワプロ14/パワプロ14 改造選手 ×5
- http://bloger.x0.com/result/パワプロ9/パワプロ9 サクセス ×5
- http://www.tyumoku.info/t-83p-83X-83-8F-81-5B-83h-... ×5
- http://shugomaeda.aboutme.jp/profile ×5
- http://d.hatena.ne.jp/yuum3/20080114 ×5
- http://bloger.x0.com/result/パワプロ12/パワプロ12 最強パスワード ×5
- http://press.eek.jp/result/深田恭子/深田恭子 ブログ ×5
- http://press.eek.jp/result/パワプロ10 パスワード/パワプロ10 パスワ... ×5
- http://kakutani.tumblr.com/ ×5
- http://mixi.jp/view_diary.pl?url=http://shugo.net/... ×5
- http://www.tyumoku.info/t-83p-83-8F-83v-83-8D10-20... ×4
- http://www.tyumoku.info/t-83p-83-8F-83-7C-83P9-28-... ×4
- http://www.sfa-cms.info:8080/word/茂野/茂野 眉村 パスワード パ... ×4
- http://press.eek.jp/result/山田涼介/山田涼介 壁紙 ×4
- http://www.sfa-cms.info/word/パワポケ9/パワポケ9 茂野 パスワード ×4
- http://press.eek.jp/result/パワポケ10/パワポケ10 パスワード ×4
- http://press.eek.jp/result/パワプロ12/パワプロ12 選手パスワード ×4
- http://www.tyumoku.info/t-83p-83-8F-83v-83-8D12-20... ×4
- http://press.eek.jp/result/パワプロ10/パワプロ10 ×4
