ikepyonのだめ人間日記

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

文字列操作と脆弱性

SQLインジェクションにしてもクロスサイトスクリプトにしても命令を示す文字列がコマンドとデータを含んでいるから起こることが多いんだよなぁと今更ながらに思う今日この頃。
脆弱性のあるアプリはデータを受け取った場合、受け取ったデータがデータなのかコマンドを含んでいるのか考慮せずにというか、受け取ったデータをそのままただのデータとして取り扱おうとする(こう書くとサニタイズ推奨してるみたいだなw)。
また、文字列をコマンドとして受け取るDBやブラウザは受け取ったコマンドが文法的に正しいかはチェックできるが、それが意図したものかどうかは判断できない。
通常、コマンドとデータが一つの文字列で表現される場合、データの区切りとかコマンドの区切り文字列がきっちり定義されている。加えて、その区切り文字列がデータとして使われる可能性があるということを考慮して、そういった場合、別の表現で区切り文字列をデータとして表現する方法も定義されているのが普通だと思う。その他特殊な意味を持つ文字列(例えば、SQLであれば%とか;とか)というのも、別の表現で特別な意味のないただのデータとして表現する方法が定義されている。
一つの文字列がコマンドとデータでできているということを考えていないと、特殊な意味を持つ文字列をデータとして取り扱いたい場合どうするかことが抜けるのかなぁと。
ま、脆弱性はコマンドとデータが混在していることだけが問題と言うわけではないんだけど・・・

と言うようなことをわかりやすく説明しないといけないかなぁと思ったり、思わなかったり・・・
てか、本当はこういうのはプログラミングの入門書とかできちんと書かなきゃいけないはずなのに書いてないんだよなぁorz