汚染

「すっかりハマってしまった…。」

Ruby にはセキュリティモデルがある。自分のマシンの中だけですべて完結するプログラムなら、特に気にする必要もないのだが、作成中の cgi アプリケーションではそういう分けにはいかなかった。善良な人が 100% とは限らないし、ミスをするかもしれないから、当然だ。基本的には外から来たものは汚染されている前提で、綺麗にして汚染を取り除けばいいのだけれども…。

単純に untaint すればいいだけだと思っていた。SQL インジェクション対策はしてあるから、フォームから入力されたままをそのまま渡しても問題ないと考え、そのまま untaint して処理を進めるコードを書いていたのだが、どーしても Insecure 例外が起こってしまう…。な、な、なぜだぁ!! 使ってるライブラリの深いところで例外が起こっていたので、原因を調査するのに、かなり難航してしまった。

ちゃんとした理由は分かってないのだが、いろいろ試行錯誤した結果、cgi が管理している文字列オブジェクトは untaint できないらしい。一度、変換したりして別の文字列オブジェクトを作ってやると、Insecure 例外が起こらなくなった。

デフォルトではセキュアよりの設定で、使う人の知識やリスクで危険側に振ることも可能となっているのは実に正しい。

…でも、今回はなかなかつらかった…。