車が雪の中に埋まってしまった。チェーン付けるのも面倒なので、しばらくは徒歩。夜鍋ひさびさに3時まで働いてしまった。CookieStoreとセキュリティ(2)ちょっと気になるのが、サーバが一度発行したクッキーは、HMACで使用する鍵を変えたりしない限り、ずっと有効だということだ。悪意のある第三者がクッキーを盗聴してリプレイを試みる、というケースについては、盗聴できたという時点で他のセッションストアの場合もセッションハイジャックが可能になるので、CookieStoreがとりわけ危険だというわけではない。気になるのは、ユーザがセッションの状態を任意の時点に戻すことができる点だ。アプリケーションの作りによっては悪さができそうな気もするのだけれど、実際のところどうなのだろう。引用]と書いたけど、問題になりそうな具体例を思い付いた。サンプルのショッピングカートアプリケーションでは、カートの格納先にセッションを使用しているが、選択された商品をカートに格納する際に商品の価格をコピーする。これは、商品の価格が変更されても、カートに入っている商品の価格はカートに入れた時点の価格のままにする、という仕様になっているためだ。任意の時点に戻すことができることだ。保存しておいて後で使用すれば、いつでも最安値で商品を購入できてしまう。対策は簡単で、カートの保存先をDBにすればよい。まとめると、CookieStoreに格納すべきでないデータは、以下のようなデータだ。ユーザに知られてはまずいデータアプリケーションの動作に重大な影響を及ぼし、状態が変わりうるデータ。後者については「アプリケーションの動作に重大な影響を及ぼす」だけだと、ログインユーザのIDすら格納できなくなるので、「状態が変わりうる」という条件を追加しないと使いものにならない。ユーザIDに対応するユーザ情報(管理権限があるか、いつまで有効か、など)は「状態が変わりうる」のでCookieStoreに格納してはいけない。ユーザIDについても、欠番になったIDを再利用しているような場合では問題が発生する。上記のような判断をきちんとできる自信のない人はCookieStoreを使わない方がよい。CookieStoreにはサイズの上限があるので、あまりセッションに情報を格納しないスタイルにプログラマを誘導できるかもしれない。そもそもこの作りの筋が悪いという話はある。以下のようにセッションの有効期限をサーバ側でチェックすることができる。実際にはユーザに適切なフィードバックを返す。Time.nowendただし、セッションに格納する情報に注意する必要があることには変わりない。注文の多い料理店に入ってしまった話Rails周りの不幸な出来事の原因はいろいろあると思うけど、その原因の一つはRailsプログラミング(あるいはRubyプログラミング・Webアプリケーションプログラミング)がその見かけほど簡単なものではないことだと思う。Railsの見かけはどんどん簡単になっていく。scaffoldからpaginationが消えてすっきりしたり、MySQLをセットアップしなくてもSQLiteがデフォルトになってすぐに使えたり、CookieStoreがデフォルトになってセッションファイルでディスクを溢れさせるようなこともなくなった。現実は厳しくて、何も考えずに「安心安全素敵」なWebアプリケーションができるわけもなく、さっきも書いたような罠があちこちに潜んでいる。RubyもRailsも、もともと初心者が何も考えずにプログラムを書けるように作られているわけではない。CやLispやJavaでもちゃんとしたプログラムが書ける人が、もっと楽にプログラミングできるように作られているだけだ。見かけの簡単さにつられてプログラムを書きはじめた初心者の周りでは色々な問題が起こる。本当の不幸の原因は、技術的なことよりも、平鍋さんの言葉を借りると「問題対私たち」という構図を作ることが難しいことにあるのではないかと思う。なりがちなのだから、会ったこともない人たちとコミュニケーションを取る場合はなおさらだ。「それはお前がマヌケだからだよ!」と言いたくなることもある。できる人・真面目な人ほど大変だろう。自分はダメな人間なので返事すら書かないことが多い。書いてたら、Linuxとタコの話を思い出した。ぐぐったら生越さんの記事が出て来た。自分もこういう姿勢で人ではなく問題そのものに向き合えるようにしたい。そのためには、場合によっては直接相手にしないことも適切な対応だろう。スルー力という言葉は嫌いだけど。池上君は実は大学のクラスメートだった。在学中に話をする機会は少なかった。バンド活動やRubyといった現実逃避に明け暮れたあげく、ついには数学科をドロップアウトしてしまったからだ。文学部哲学科に変わったものの、一年留年して卒論をでっちあげて卒業した後、こうしてRubyを仕事にしてしまっている。今も現実逃避の真最中というわけ。ここまで来たら精一杯逃げ続けるしかない。池上君も僕を見習ってもうちょっといい加減に生きたらいいと思うよ。2.0ではCSRF対策のコードがデフォルトで入ったし、世界はちょっとずつマシになっている。したレポートをもらってるのにたんに面倒で返事をしてないメールはいっぱいあります。めげずに催促してください。返事は保証しないけど。RailsでMySQLを使う際のcollation周りの問題についてRailsでMySQLを使う時のcollation周りの注意点のメモ。db:create:allとかすると、デフォルトではcollationがutf8_unicode_ciになるが、大文字小文字や半角全角を区別しないだけならまだしも「パ」と「バ」の区別もされない。欧米の人にはutf8_unicode_ciの方が都合がいいんだろうけど。以下のページの手順でutf8_general_ciやutf8_binに変更しておくとよい。ActiveRecordでデフォルトの照合順序を変更するvalidates_uniqueness_ofのcase_sensitiveオプション以下のページで指摘されているように、validates_uniqueness_ofのcase_sensitiveオプションはデフォルトがtrueなので、大文字小文字を区別しないcollationのテーブルでもBINARYキーワード付きで大文字小文字を区別しない検索をしてしまう。その2collationが*_ciの時はいちいちcase_sensitiveオプションを指定しないといけないけど、DRYじゃない。collationを参照してデフォルトの動作を変えるプルリクエストを送ってみたけど、あまり反応がない。RDBMSによってデフォルトの動作を変えたくないのかもしれないけど、それならデフォルトのcollationをutf8_binにするべきだ。このあたりRailsでMySQLを使っている人は不満に思っていないのだろうか。それともHerokuの影響で今時はみんなPostgreSQLなんだろうか。妻のキューブ(Z12)の車検でバッテリー交換に3万8千円かかるとのことだったので、エクシーガ同様にネットで購入して自分で交換した。アイドリングストップ車なので、純正バッテリーはS-95だった。PanasonicだとN-S100/A2が適合。N-S100/A2購入先は前回と同じホームセンターセブンにしたけど、今回はなぜかAmazonより楽天の方が安かったのでそちらにした。