言いだしっぺの高木先生お墨付き。一応、原典についてもリンクを示しておこうかしら。
てゆか、「やっぱりそれでいいんだよなぁ」と内心「ホッとした」というのが正直な感想。
思うんだが、「セキュリティー対策」と「セキュリティーホール対策」は、分けて考えるべきだと思う。
「セキュリティー対策」ってのは、その名の通り、セキュリティーを積極的に向上する為の対策であって、主な内容としてはウイルス対策ツールの導入だとか、プライベートファイヤーウォールの導入だとか (Unix 風 OS の常識から言えば、ポートフィルタリングは施していて当たり前とも思うが)、パッチを自動更新するだとか、バックアップを毎日取る ;-) だとか言ったような、ユーザーが (目的に応じて) 行う行動のことを指す。
「セキュリティーホール対策」ってのは、実態としては対策でもなんでもなくて、よーするに開発者が、欠陥のないプログラムを書くことを指す。積極的な対策の内容としては、せいぜい「ちゃんと勉強する」とか、「潜在要求の洗い出しをしっかりやる」とか、「よく考えて設計する」 (あるいは「レビューをしっかりやる」) とか、「ソースや文書の履歴管理をきっちりやる (cvs とか使って)」とか、「効率よくテストする」とか、「不具合管理を徹底する」とか、そんなところになるんではないかと思う。よーするに、ソフトウェア開発の現場に立つ人間であれば、誰でもやっているはずのことでしかない。
「サニタイズ」って言葉は、まるでプログラムが危険ゴミを見つけ出して一つ一つ取り除かなきゃいけないような印象を受ける。そもそも、そのデータ (の中の特定要素) が危険ゴミになるような場所に、危険ゴミが混入し得ないシステムとして設計されていれば、「サニタイズ」なんて意識する必要などないはずだ。
「でも、事実としてそういうシステムになっていないじゃないか」というのならば、その辺は自分でフォローすべきだと思う (ていうか、そうするしかないだろう)。たとえば、PHP で変数を HTML 出力するシーンでは、echo htmlspecialchars
のラッパーを、俺様ライブラリとして用意すれば良いんではないかと思う。
<?php define("HTML_CHARSET", "UTF-8"); function spill($text) { echo htmlspecialchars($text, ENT_COMPAT, HTML_CHARSET); } ?>
で、実際の出力時はこんな感じで。
<table> <tr> <td>氏名</td> <td><?php spill($name); ?></td> </tr> <tr> <td>住所</td> <td><?php spill($address); ?></td> </tr> <tr> <td>電話番号</td> <td><?php spill($tel); ?></td> </tr> <tr> <td>メールアドレス</td> <td><?php spill($email); ?></td> </tr> </table>
もっと複雑なケースではどうすべきか? って議論もあると思う。例えばユーザーの入力した HTML を部分的に許可したい場合とか、Wiki 文法を HTML 化したい場合とか。それらのケースでは、フィルタリング用のメソッドを設けて、そのメソッドの中で出力を行うようにすればいいと思う。あくまで、責任の所在は出力を生成する箇所であると決めてしまえば、設計上はすっきりするのではないかと思う。
セコメントをする