SQLインジェクション(続き)

succeed2004-09-26

仕事に飽きたので、書きます。
SQLについては前回解説した通りなのですが、一体いつ、そんなことが起きるのか。それはすなわち、相手が入力した文字列を、文字列ではなく命令と認識しうる時、です。これは、SQLに限った話ではありません。PerlPHPのようなスクリプト言語は常にその危険性にさらされていると言えます。
ちょっと複雑なケースを考えて見ましょう。あまり無いとは思いますが、テキストファイルをサーバー側に保存できるシステムがあったとしましょう。画像掲示板などがありますが、あれのテキストファイルバージョンです。このシステム上に置いて、ファイルの拡張子を自由に変更可能で、なおかつPHPスクリプトPerl-CGIの実行が認められていた場合、そのサーバー上でほとんど自由にプログラムを実行できることになります。実際、そのようなシステムを作ることは可能です。
このように、ちょっとした作りの問題で、思いもしないようなスクリプトを実行することは可能になっているのです。この様な問題が、どうしてSQLの場合には顕著になるのか。それは、単純にアクセスの難しさにあります。Webサービスだけを考えてみても、普通のCGIであれば
ブラウザ→CGIスクリプト→ブラウザ
というデータの流れですが、DBMSを使うのであれば
ブラウザ→CGIスクリプトDBMSCGIスクリプト→ブラウザ
と、長くなります。おそらく、この長さが問題を見難くしている原因になっているのではないでしょうか。