II-21-5. CGIスクリプトにおけるセキュリティ対策

サーバにおける動的コンテンツを実現するServer Side Includes (SSI)やCommon Gateway Interface (CGI)の仕組みを簡単に説明し、ファイルの取り扱いやデータベースへのアクセスなど、CGIスクリプトの取り扱いで留意すべきセキュリティ対策の項目について解説する。

【学習の要点】

* CGIスクリプトはホストで動作する任意のプログラムである。適切なセキュリティ制限の設けられていないシステム上では、CGIスクリプトの作者に悪意があれば、システムを破壊することもできることを念頭において導入する必要がある。

* SSIもまたCGIと同様、システムに対して影響を与えかねない強い権限を持つプログラムである。SSIを必要としないシステムではこれをオフにしておくことが賢明である。

* CGIスクリプトの受け取る入力値は常にサニティチェックが行われるべきである。特にユーザの入力値をもとに、リレーショナルデータベースにSQLを使ってアクセスするようなCGIスクリプトは、確実に入力値をサニタイズすることが要求される。

図II-21-5. CGIの動作原理

【解説】

1) CGIスクリプトとSSI

* CGI(Common Gateway Interface)は、Webサイトからプログラムを呼び出す標準的なインタフェースである。呼び出されるプログラムは、OSのシェルで実行できる任意のコマンドであればよい。CGIを呼び出すWebサーバは、環境変数とプログラム引数をセットして該当プログラムを呼び出す。

* SSI(Server Side Include)は、HTMLドキュメントに挿入されたSSIコマンドを実行する仕組みである。SSIエンジンの解釈するコマンドはいくつかあり、ファイルの最終更新日時を出力したりOSの任意のコマンドを実行したりすることができる。

2) CGIスクリプトの危険性

* 仮にWebサーバ自身にセキュリティホールが存在していなくても、CGIスクリプトが追加的にセキュリティホールを生成することがある。

* CGIスクリプトのセキュリティの確保には、経験と専門的な知識が必要とされるが、CGIスクリプトの作者がこれを満たしていることは多くない。

* CGIスクリプトが取得するリクエストパラメータの値は慎重に検査されるべきである。これを怠ると、OSコマンドイジェクトション、SQLインジェクション、XSSなどの攻撃に対して非常に脆弱になる。

3) CGIスクリプトの取り扱い

* CGI スクリプトは、サーバのドキュメントルートではなく、cgi-binディレクトリを作り、そこに入れることが推奨されている。例えば、サーバ上にあるCGIファイルを直接エディタで編集しようとするとき、エディタがスワップファイルを作ることがあるが、このようなファイルが予期せずドキュメントルートに公開されないようにするためである。

* シェルコマンドを呼び出す場合は、その必要性を十分に検討するべきである。C言語を使用している場合は、コマンドを呼び出すよりも、ライブラリのAPIを呼び出すべきである。その方が効率が良い場合が多い。PerlやPHPを使用している場合は、十分に入力文字列の検査をしてからコマンドを組み立てるよう留意する。可能であれば言語の外部拡張機能を利用してAPI化することも検討する。

* とりわけC言語を用いてCGIスクリプトを作成する場合、バッファオーバーフローに十分に注意する必要がある。ユーザの入力する文字列を十分な検査なしに不用意に固定長のバッファに割り当てることは避けられるべきである。

* CGIスクリプトは、デフォルトの状態ではWebサーバのユーザで実行される。ApacheのsuEXECは、CGIスクリプトの実行ユーザを他のユーザ(と適切なパーミッション)に切り替えることを可能にする。

OSS Course Naviのコンテンツは IPA OSS モデルカリキュラムを基としています。

フォーラム会員企業専用

記事配信

コンテンツ配信

ユーザログイン