CGI気を付けよう


HOME] [0章] [1章] [2章] [3章] [4章] [5章] [?章

 ここでは、CGIでおかし易いミステークの 例を挙げてみます。また、セキュリティホールを 作らないためのコツも挙げてみました。

 CGIはホームページを楽しく、インタラクティブに するための道具ですが、同時にサーバーに重大な セキュリティホールを作り出すもとともなります。
 危険を怖れて何にもしないのも馬鹿げていますが、 わざわざ自分のサーバーを危険に晒すのも馬鹿げています。 さらに、商用のサーバーでセキュリティーホールを 開けてしまえば、仮に単なる不注意だとしても 損害賠償に発展することも考えられます。

MIMEヘッダの前にうっかり他のデータを出力しない
出力の始めには正しいMIMEヘッダを出力します。 (ただし、Non-Parsed Header CGIの場合は、この前に httpdヘッダがきます) また、MIMEヘッダは空行で終ることに注意します。 うっかり、MIMEヘッダの前に他のデータを書き出すと、 httpdがヘッダを見つけられないために、 ブラウザに何にも送出してくれないことがあります。 これは、シェルでデバッグするために、挿入した printf()文などを消し忘れてhttpdで実行した時にも 起きることがあります。
データファイルはnobodyがアクセスするからね
データファイルはnobodyがアクセスできるように 666などのパーミッションを与えます。 CGIプログラムがファイルやシンボリックリンクを 作成する時には、そのディレクトリにnobodyが 書き込みアクセスできなければなりません。 また、シェルでテストしたときに本番ではnobodyが 作成するはずのファイルを他のユーザーが作成し、 消し忘れた時にもこの問題が起きます。
メモリは返そうね
プログラムのなかで、malloc()などで動的に取得した メモリは必ず開放しましょう。小さな領域でも 塵も積もれば山となるで、そのうちシステムがフリーズ してしまうかも。
標準ライブラリでつかっている変数を使わないこと
たとえば、error.hで定義してあるerrnoなどを再定義して使うと、 知らないうちに値が変わっていたりして、 予期しない結果を引き起こします。 疑問があるときは、ヘッダファイルを見直してみましょう。
ユーザーの入力を信用しない
フォームでばかでかいデータや空文字列を送られたときに 対処していますか。これは、故意あるいは偶然に生じ得ます。 クラッキングの方法としても知られています。 長さの解らない標準入力を固定長の配列で受けたりすることは 危険です。きちんとCONTENT_LENGTHで長さを調べて、 malloc()などでバッファを確保しましょう。
ユーザーの入力をそのままシェルに送らない
例えば、fingerの引数をユーザーから受け取るというような 場合、ユーザーが、hogehoge; cat /etc/passwdや hogehoge; rm -rf *を入力したら大変です。 この方法もクラッキングの方法として広く知られています。 ユーザーの入力は必ず検査するか、 直接の入力ではなく、マルチプルチョイスにしましょう。
改行コードの問題
WindowsではCR/LF、UNIXではLFになっています。 Windowsで作ったファイルをこの変換なしに UNIXマシンにアップして、コンパイルしたりすると、 変なエラーが出力されます。
バッファのフラッシュを適切にする
標準の設定では、出力はバッファリングされます。 たとえば、メインルーチンで短い出力をした後、 別のプロセスで出力をする例を考えましょう。 もしかすると、メインのバッファがフルになる前に、 別プロセスの出力が送出され、出力の順が逆転するかもしれません。 別プロセスに制御を渡す前にバッファをfflush()しましょうね。
WWWのドキュメントツリーにアノニマスFTPを許さない
これを許すと、ユーザーは手製のプログラムやスクリプトを アップして、それをWWWで実行できてしまいます。 つまり、ユーザーはあなたと同じことができてしまいます。
インデクス表示をさせない
サーバーはインデクス表示を行わないように設定しましょう。 でないと、ディレクトリの内容が丸見えになります。 ユーザーはひょんなことから、危険なテスト用のプログラムを 発見するかもしれません。 インデクスを表示させないために、見せたくないディレクトリに ダミーのindex.htmlを置くのも良い方法です。
.htaccessを用いない
WWWのディレクトリツリーに置くと、内容を見られる可能性があります。 どうしても用いるなら、サーバーの設定で、.htaccessとは掛け離れた 名前をローカルアクセス構成ファイルに割り当てましょう。
余計なものは置かない
特に危険性のあるテスト用のスクリプトやプログラムは 使ったら直ぐにユーザーがアクセスできないところに移しましょう。
hidden属性の値は誰でも見れる
HTMLのソースを表示すれば、hidden属性の値は見えてしまいます。 またこの値を変えて、フォームを再送することも 誰にでもできることです。 このことは、やられるものとしてセキュリティを考えておくことです。

Copyright 1999 Motoi Fujita