ちょっと前からですけど、SQL injection の祭りになってますね。第何次だろう。。。
ということで、injection 系の攻撃について改めて考察してみる。
Injection 系の脆弱性で有名なのはこんなのがあると思います。
- SQL injection
- XSS (cross Site Scripting), script injection
- OS command injection
これらのものの共通点ってなんでしょう?
命令と data を混在させて扱えることですね。
ここに根本的な解決策があるわけです。混在させることが問題の本質なんですから、命令と data を完全に分離できるようにすればよいわけです。
SQL injection の対策としては、stored procedure, parameterized query の利用がありますね。これ行っていることがまさに命令と data の分離ですね。Data を parameter として切り出すことによって、絶対に命令として実行できないようにしています。
もちろん software として実装されているものなので、自分で同等のものを作成することもできます。ただ、それが本当に現実的でしょうか?脆弱性を作らないようにそういったものを用意するのは非常に大変です。というのは、扱う言語仕様を完璧に理解したうえで、間違いなく実装することが求められますから。
SQL の言語仕様完璧に抑えている人どれだけいますか?
HTML の言語仕様完璧に抑えている人どれだけいますか?
Shell の言語仕様完璧に抑えている人どれだけいますか?
それを完璧に理解していなければ独自の実装などやるべきではないです。多少面倒でも、標準で用意されている安全な方法を利用したほうがよいでしょう。
なお、XSS に関しては、要件によりますね。多くの場合、HTML tag を入力として扱う必要がないと思いますので、data と tag を分離するようにすれば問題ありません。難しい場合 (たとえば blog とか) には、HTML の仕様完璧に理解した上で扱いましょう。
OS command injection に関しては OS command を扱わないのが近道です。OS command 使わないと処理できないなんてことないでしょうから。