日替わり NAT’s Champloo

音楽やライブ(HM/HRやボカロなど)、旅行など、ごちゃっとした日記

余計な事をするとバグも増える

小田急電鉄、特急券予約サイトで他人の会員情報が閲覧できてしまうトラブルがあったらしい。いったんログアウトして、Webブラウザを閉じずに再度ログインした場合に、その会員の予約情報などが別の会員のWebブラウザに表示されるというバグらしい。小田急予約サイトで競合状態バグによるトラブル | スラドのコメントにもあるけど、J2EEを使ったWebアプリなら、ユーザのセッション情報はHttpSessionだけに置くコードになっていれば、こんなことは起きないはずなんだけどなぁ。
全くの予想だけど、メモリ節約とかのために、ユーザのセッション情報を覚えているオブジェクトをstaticな変数とかApplicationスコープのServletContextとかに置いて使いまわしたりすると、こういうことが置きうるんじゃないかな。ユーザAがログアウトしたので、そのユーザのセッション情報オブジェクトを別のユーザBのセッション情報オブジェクトとして使いまわした。でも、ユーザAがまたログインしたので、そのセッション情報オブジェクトがまた使われて、ユーザAの予約情報が入ったりする。そうするとユーザBの処理で、ユーザAの予約情報を見ることができてしまう。
ユーザのセッション情報はHttpSessionだけに置いて、他の手段を使わなきゃ良いのに、変にオブジェクトの使いまわしとか考えて、セッション情報の抜け道ができてしまい、それがバグにつながったという経緯かもしれない。
最近思うのだけど、ソフトウェアのバグを減らす良い方法のひとつは、余計な事をしないことかもしれない。変にメモリ節約とか性能向上とかのために、色々と工夫すると、かえってその工夫の中に間違いが入り込んでしまう。たいていの場合、そういう工夫は複雑で難しい処理だったりするし。「バグを作らない一番の方法は、プログラムを書かないことだ」なんて言葉(誰の言葉かは忘れた)もあるくらいだしね。