ログ日記

作業ログと日記とメモ

サニタイズ

凄く反応が遅いけど。
高木浩光@自宅の日記 - プログラミング解説書籍の脆弱性をどうするか, 「サニタイズ言うなキャンペーン」とは何か, ASPとかJSPとかPHPとかERBとか、逆だ..


最近のプログラム入門書は、文字列解析機構があるという考え方がないのかな。書いてる人もそういう意識があまり無いのかもしれない。


私が初めてプログラムを書いたのはPerl掲示板だったように思う。(C言語の入門書は数列計算とかカレンダー表示とか面白くない例しかなかった)
初めにHTTPヘッダを出力して、リクエストを&と=で区切って変数に入れ、出力時にもまたまた正規表現を使って < を &lt; に変換していったりとか。
その上で例えばフォントタグを使いたいならフォントタグだけ許可する。
それも甘いチェックだと属性を使ってすぐ悪戯(?)されるから正確にパースしなければならなかったと思う。
禁止するタグだけ設定するとしたら、例えば

<script>

の文字列を単純にを禁止しても、すぐに

< script >

とかやられちゃう。
ファイルに保存するときも安易にタブ区切りにしてると、タブをコピペで入力されてバグったり。
そんなわけで文字列を解析して正しい処理をするということは普通だったわけで。
区切り文字(トークン?特別な意味がある文字)については入門の時点で解説されていた。


それがPHPになるとリクエストを$_GETで簡単に受け取れたり、DBが簡単に使えたりでそういう所に意識を向けにくいのかも。
DBにしてもシングルクォーテーションをデータとして記録できるべきだし、ファイル名にしても../を記録できるべきだ。
例えばアップローダでファイル名を../としてアップしても、タイトル一覧で../を表示できて内容を見れる方が普通だとまず考える。アプリケーション上のファイル名と実際のパスは別問題。実際のパスと同一にするのは手を抜くためだと考えれば、ただの文字列と実際のパスの扱い方について自然と意識する。


昔(5,6年前?)の入門書を読んだら自然とそういう考え方になった気がするんだけども、今は無理なのか。便利で簡単にプログラムが書けるようになっても頭が追いついていかない。むしろサニタイズとか刷り込みがある分だけ今の方が厄介か。


カーネルソースのパス探索部分を見てるとC言語で一文字一文字解析してるんだけど、そういう部分を実際に見たり情報系の授業で習ったりしているとだいぶ違ってくるんだろうな。