ikepyonのだめ人間日記

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

ありえない対策

まっちゃさんとこでJavascriptを使ってXSSの対策をとったところがあるというのを見たけど、どうも開発者がHTTPとかJavascriptとかの仕組みを理解していないっぽい。
HTTPとJavascriptの仕組みを理解していればこのような対策はとらないと思うんだけど・・・

XSSが発生する原因の根本は、Webアプリケーション側で制御できないブラウザで問題が発生するためだけど、それがわかってないっぽい。
XSSだけでなく、SQLインジェクションも、コマンドインジェクション、LDAPインジェクション、などなどインジェクションという名前の付くものは多分全て、Webアプリケーションのプログラムが制御できない自分以外のアプリケーションで、プログラマの意図しない動作をしてしまうことが原因だ。
制御できないというのはWebアプリケーション側から受け取った命令が正しいかどうか受け取った側からは分からないということだ。その為、受け取った側はそれが全て正しい命令として解釈しようとするので、こういった問題が発生する。

だから、プログラムと外部プログラムの境界部分(この場合だとHTMLを返す部分)で、外部プログラムが意図しない動きをしないかどうかをチェックする必要がある。
入力でチェックすりゃええやんという意見もあるだろうけど、処理した結果、どの様になるか分かりづらいことがあったりするので可能なら出力直前にチェックする方が望ましい。
最も、出力直前だけでいいかというと、例えばバッファオーバーフローのように、入力直後にチェックしたほうがいいものもある。これはXSSや、SQLインジェクションなどと異なり、受け取ったプログラム自体が誤動作するものがあるからだ。
とはいえ、これら一部の例外についてももっと小さな単位(関数やらメソッドやら)で見た場合、同じことが言える。そのスコープが大きいか小さいかの違いだけで、考え方は同じなんだけどね。

バッファオーバーフローのように呼び出す関数若しくはメソッドの引数として使う直前にチェックする方が安全といえるんだけど、毎度毎度同じチェックをその関数とかを呼び出す直前にチェックするのは手間なので、受け取った関数、メソッドの側で問題が無いかチェックしたほうがよい。
だから、場合場合によって入力と出力のどちらでやるか検討がしたほうが良いと思うんだな。