CGI気を付けよう
ここでは、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属性の値は見えてしまいます。
またこの値を変えて、フォームを再送することも
誰にでもできることです。
このことは、やられるものとしてセキュリティを考えておくことです。