ikepyonのだめ人間日記

セキュリティに関することを書いていく予定。

セキュアにコーディング

昨日見つけた記事をじっくり読んでみた。
本来の意味でのハンガリアン記法はすごいかもしれない。一般に言われているハンガリアン記法は変数の型を変数名に持たせちゃえというのだけども、本来は、変数名、関数名に状態(意味といった方がいいか?)を持たせるというものだったらしい。
例えば安全だったら接頭辞に「s」を、安全でなかったら、接頭辞に「us」をつけるという言った感じ。
そうすると、こんな感じになる。

usParam = Request.getValue("param");
sParam = sEscape(usParam);

これらは、「=」左辺と右辺で接頭辞が同じであればよいことになるので、正しいコードとして認識しやすい。

output.sWrite(usParam);
output.write(sParam);

また、これらも、安全でない変数を安全な関数で使うか、安全な変数を安全でない関数で使うことが一目瞭然のため、分かりやすい。

ところが、こんな場合は危険なコードとなる。

sParam = Request.getValue("param");
output.write(param);

安全でない変数を安全とみなす変数に代入したり、安全でない変数を安全でない関数で使うことになるため、危険な匂いがぷんぷんするわけだ。

param = sEscape(Request.getValue("param"));
output.sWrite(sParam);

また、こういったものも、2重にエスケープしてしまうという間違いを起こす可能性があるので、危険なコードといえる。

これは何も、セキュアなコーディングに関するだけじゃないと思う。例えば、あるかどうか分からないけど、アプリケーションで複数の文字コードを処理しなければならないとき、SJISだったら「sjis」、EUCだったら「euc」、JISだったら「jis」、UTF8だったら「utf8」のように接頭辞を決めてしまえば、今変数に入っているコードは何か一目瞭然だ。こうすることで、バグの混入を少なく出来るのはすばらしいと思う。

一般に言われているハンガリアン記法は変数の型を表記してしまうけど、これって、コンパイラやツールがチェックしてくれるのであまりうれしくないけど(Cの場合はポインタか実体か一目で分かるのでこれはこれで便利だけどね)、本来の意味でのハンガリアン記法は、その変数、関数がどういった状態なのかというのを一目で分かるのですばらしいなぁ。なんといっても、危険なコードの匂いが、機械的に判断つくというのがいいねぇ。

今度から、ハンガリアン記法使ってみようっと。