CGIについて1から書いております
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
SSIやCGIは便利さの代償としてセキュリティ上非常に危険なものです。以下の文章はセキュリティを強化するために必要な情報ですが、反面、未防御のシステムに対してアタックをかけるための情報にもなってしまいます。この場で記載すべきかどうか悩んだのですが、このホームページの読者を信用して公開することにしました。
◆ index.htmlを設置する
CGIスクリプトを置くディレクトリには index.html を置いておきましょう。index.html が存在しない場合、cgi-bin ディレクトリをブラウザでみるとCGIスクリプトの一覧が見えてしまいます。ファイル名からセキュリティホールのあるスクリプトを見つけてアタックされる可能性が高くなります。
◆ 見られるとまずいファイルはpublic_htmlの外に
パスワードファイルなど、見られるとまずいファイルは、public_htmlの外など、通常の閲覧者が見ることのできないディレクトリに置きましょう。(それでも、同じサーバーにログインできる人や、他の人のCGIのセキュリティホールのために、見られてしまうことはあります。)
◆ evalの危険性
perlはよく分からないのでCGIスクリプトをシェルで記述しよう・・・と思った時など、CGIスクリプトのパラメータを解釈するためによく、UNIX のシェルの eval を利用しますが、これは大変危険です。もし、変数名NAMEの値として「値;危険なコマンド」を指定されると・・・
◆ grepの危険性
「grep $KEY file」というコードも危険です。もし、KEYの値としてバッククォーテーション( ` )で囲まれた「`危険なコマンド`」を指定されると・・・
◆ SSIの危険性
チャットや伝言板など利用者の書き込んだメッセージを表示するシステムではSSIに注意してください。もし、「」を書き込まれると・・・
◆ パスワード漏洩の危険性
人様のパスワードを扱う場合はとにかく厳重に扱ってください。多くの人は同じパスワードを使いまわします。あなたのサービスが不法使用されるだけでなく、同じパスワードを使いまわしていた他の有料サービスも不法使用される恐れがあります。あなたのCGIスクリプトは完璧でも、同じサーバー上の他の人の不備で情報が漏れる可能性もあります。パスワード情報ファイルに password.txt などといった安直な名前はつけないようにしましょう。
◆ index.htmlを設置する
CGIスクリプトを置くディレクトリには index.html を置いておきましょう。index.html が存在しない場合、cgi-bin ディレクトリをブラウザでみるとCGIスクリプトの一覧が見えてしまいます。ファイル名からセキュリティホールのあるスクリプトを見つけてアタックされる可能性が高くなります。
◆ 見られるとまずいファイルはpublic_htmlの外に
パスワードファイルなど、見られるとまずいファイルは、public_htmlの外など、通常の閲覧者が見ることのできないディレクトリに置きましょう。(それでも、同じサーバーにログインできる人や、他の人のCGIのセキュリティホールのために、見られてしまうことはあります。)
◆ evalの危険性
perlはよく分からないのでCGIスクリプトをシェルで記述しよう・・・と思った時など、CGIスクリプトのパラメータを解釈するためによく、UNIX のシェルの eval を利用しますが、これは大変危険です。もし、変数名NAMEの値として「値;危険なコマンド」を指定されると・・・
◆ grepの危険性
「grep $KEY file」というコードも危険です。もし、KEYの値としてバッククォーテーション( ` )で囲まれた「`危険なコマンド`」を指定されると・・・
◆ SSIの危険性
チャットや伝言板など利用者の書き込んだメッセージを表示するシステムではSSIに注意してください。もし、「」を書き込まれると・・・
◆ パスワード漏洩の危険性
人様のパスワードを扱う場合はとにかく厳重に扱ってください。多くの人は同じパスワードを使いまわします。あなたのサービスが不法使用されるだけでなく、同じパスワードを使いまわしていた他の有料サービスも不法使用される恐れがあります。あなたのCGIスクリプトは完璧でも、同じサーバー上の他の人の不備で情報が漏れる可能性もあります。パスワード情報ファイルに password.txt などといった安直な名前はつけないようにしましょう。
PR
◆ アットマーク(@)の扱い
Perl5でダブルクォーテーション("...")の間にアットマーク(@)を記述する場合は @ を \@ と記述する必要があります。Perl4の場合や、Perl5であってもシングルクォーテーション('...')であればそのまま @ と記述できます。
◆ 画像ファイルに広告データが挿入される
広告付きのサイトを利用している場合が、カウンターなどの画像データにまで、広告画像が自動的に挿入されてしまい、画像データが壊れてしまうケースがあるようです。対策は利用サーバのマニュアルなどを参照ください。
◆ Perlのバージョンが異なる
サイトによっては perl のバージョンが 3 や 4 など古いバージョンだったり、perl 5 を利用するには /usr/bin/perl5 や /usr/local/bin/perl5 のように指定する必要があるサイトもあるようです。
◆ CGIの仕様が一般と異なる
print "Content-Type: text/html\n\n"; の前に、print "HTTP/1.0 200 OK\n"; の追記が必要など、サイトによっては CGI の仕様が一般のものと多少異なる場合があるようです。
Perl5でダブルクォーテーション("...")の間にアットマーク(@)を記述する場合は @ を \@ と記述する必要があります。Perl4の場合や、Perl5であってもシングルクォーテーション('...')であればそのまま @ と記述できます。
◆ 画像ファイルに広告データが挿入される
広告付きのサイトを利用している場合が、カウンターなどの画像データにまで、広告画像が自動的に挿入されてしまい、画像データが壊れてしまうケースがあるようです。対策は利用サーバのマニュアルなどを参照ください。
◆ Perlのバージョンが異なる
サイトによっては perl のバージョンが 3 や 4 など古いバージョンだったり、perl 5 を利用するには /usr/bin/perl5 や /usr/local/bin/perl5 のように指定する必要があるサイトもあるようです。
◆ CGIの仕様が一般と異なる
print "Content-Type: text/html\n\n"; の前に、print "HTTP/1.0 200 OK\n"; の追記が必要など、サイトによっては CGI の仕様が一般のものと多少異なる場合があるようです。
◆ ヘッダにスペルミスがある(共通)
意外に多いのがこれ。Context-type: になっていたり、test/html や type/html になっていたり....もう一度確認してみましょう。
◆ CGIスクリプトの出力漢字コードが変(共通)
CGIスクリプトから出力する漢字コードはJISコードにするのが無難です。通常はブラウザが自動判断するのですが、Windowsで使用されているシフトJISと、UNIXで使用されているEUCの場合は誤判断してしまうことがあります。
◆ ブラウザの漢字コード選択が変(共通)
EUCのファイルを書き出しているのに、ブラウザの文字コード選択([表示]-[エンコード])がシフトJISのままになっていて、うまく表示できないケースがあるようです。
◆ ファイルへの同時アクセスに注意(共通)
CGIスクリプトは複数のブラウザ(ひとつのブラウザからでも)同時に起動されます。CGIスクリプトからファイルを更新する際は、ロックファイルの生成などにより排他制御を行う必要があります。
◆ ブラウザの[画像表示]チェックがオフになっている(共通)
CGIを<img>タグから呼び出す場合、Netscapeの場合[オプション]→[画像の自動読み込み]、Internet Explorerの場合[表示]→[オプション]→[情報]→[画像の表示]がオンになっていないと読み込まれません。
◆ text/plain のわな(共通)
Content-type: text/plain を使用した場合、Internet Explorer 3.0以降ではうまく動かないことがあります。[表示]→[オプション]→[プログラム]→[ファイルタイプ]で、.cgiという拡張子のファイルにメモ帳などのプログラムを割り当てている場合、text/plain 形式の実行結果をダウンロードしてしまい、期待通りの動作をしないことがあります。
◆ カレントディレクトリの差異(Win)
Windows NT + IISの場合は、CGIスクリプトが動作する際のカレントディレクトリ(作業フォルダ)の場所が異なる場合があります。スクリプトの最初の方に、chdir("C:/HomePage/cgi-bin"); などの1行(C:/~の部分にはCGIスクリプトを置いているフォルダを指定する)を追加することで回避できる場合があります。
◆ もう一度スペルチェック(共通)
すべて確認したのに、どうしても動かない・・・そういう時は、もう一度、すべてのスペルをチェックしてみましょう。大文字・小文字もあわせて見てください。l(小文字のエル)と I(大文字のアイ)と 1(数字の1)は間違えやすいので気を付けてください。
意外に多いのがこれ。Context-type: になっていたり、test/html や type/html になっていたり....もう一度確認してみましょう。
◆ CGIスクリプトの出力漢字コードが変(共通)
CGIスクリプトから出力する漢字コードはJISコードにするのが無難です。通常はブラウザが自動判断するのですが、Windowsで使用されているシフトJISと、UNIXで使用されているEUCの場合は誤判断してしまうことがあります。
◆ ブラウザの漢字コード選択が変(共通)
EUCのファイルを書き出しているのに、ブラウザの文字コード選択([表示]-[エンコード])がシフトJISのままになっていて、うまく表示できないケースがあるようです。
◆ ファイルへの同時アクセスに注意(共通)
CGIスクリプトは複数のブラウザ(ひとつのブラウザからでも)同時に起動されます。CGIスクリプトからファイルを更新する際は、ロックファイルの生成などにより排他制御を行う必要があります。
◆ ブラウザの[画像表示]チェックがオフになっている(共通)
CGIを<img>タグから呼び出す場合、Netscapeの場合[オプション]→[画像の自動読み込み]、Internet Explorerの場合[表示]→[オプション]→[情報]→[画像の表示]がオンになっていないと読み込まれません。
◆ text/plain のわな(共通)
Content-type: text/plain を使用した場合、Internet Explorer 3.0以降ではうまく動かないことがあります。[表示]→[オプション]→[プログラム]→[ファイルタイプ]で、.cgiという拡張子のファイルにメモ帳などのプログラムを割り当てている場合、text/plain 形式の実行結果をダウンロードしてしまい、期待通りの動作をしないことがあります。
◆ カレントディレクトリの差異(Win)
Windows NT + IISの場合は、CGIスクリプトが動作する際のカレントディレクトリ(作業フォルダ)の場所が異なる場合があります。スクリプトの最初の方に、chdir("C:/HomePage/cgi-bin"); などの1行(C:/~の部分にはCGIスクリプトを置いているフォルダを指定する)を追加することで回避できる場合があります。
◆ もう一度スペルチェック(共通)
すべて確認したのに、どうしても動かない・・・そういう時は、もう一度、すべてのスペルをチェックしてみましょう。大文字・小文字もあわせて見てください。l(小文字のエル)と I(大文字のアイ)と 1(数字の1)は間違えやすいので気を付けてください。
◆ .htaccessの改行コードが変(共通)
.htaccessを設置する場合は、.htaccessの改行コードもまた、サーバーのOSタイプにあわせてやる必要があります。
◆ .htaccessの最後の行が改行されていない
.htaccessの最後の行が改行されていないと、その行は無視されてしまうようです。
◆ CGIスクリプト内で使用するコマンドのパスが変(共通)
スクリプト実行時、スクリプト内で使用するコマンドのパス(PATH)が通っていない場合があります。TELNETなどでログインした時のPATHと、CGIスクリプトが実行される時のPATHは異なるので注意してください。コマンドはなるべくフルパスで記述したほうが無難かもしれません。
◆ 最初の1行が変(UNIX)
CGIスクリプトの最初の1行は「#!」で始めるようにしてください。CGIスクリプトは「#!」で始めなくてはなりません。「#!」の前に空白文字や空行があってもいけません。
◆ ヘッダ行のあとの空行が無い(共通)
Content-type: text/html などのCGIヘッダの後には必ず、1行以上の空行を出力してください。これを怠るとCGIスクリプトは正常に動作しません。
◆ 大文字、小文字の区別が誤っている(UNIX)
UNIXというOSは通常、アルファベットの大文字と小文字を別の文字として扱いますので注意してください。たとえば、test1.cgi と TEST1.CGI はまったく別のファイルとして扱われます。
◆ ブラウザのキャッシングに惑わされている(共通)
ブラウザがCGIスクリプトの結果をキャッシングするために、スクリプトを書き換えても古い情報が表示されたりします。CGIスクリプト変更時には十分に注意して、再読み込みを欠かさないようにしましょう。
.htaccessを設置する場合は、.htaccessの改行コードもまた、サーバーのOSタイプにあわせてやる必要があります。
◆ .htaccessの最後の行が改行されていない
.htaccessの最後の行が改行されていないと、その行は無視されてしまうようです。
◆ CGIスクリプト内で使用するコマンドのパスが変(共通)
スクリプト実行時、スクリプト内で使用するコマンドのパス(PATH)が通っていない場合があります。TELNETなどでログインした時のPATHと、CGIスクリプトが実行される時のPATHは異なるので注意してください。コマンドはなるべくフルパスで記述したほうが無難かもしれません。
◆ 最初の1行が変(UNIX)
CGIスクリプトの最初の1行は「#!」で始めるようにしてください。CGIスクリプトは「#!」で始めなくてはなりません。「#!」の前に空白文字や空行があってもいけません。
◆ ヘッダ行のあとの空行が無い(共通)
Content-type: text/html などのCGIヘッダの後には必ず、1行以上の空行を出力してください。これを怠るとCGIスクリプトは正常に動作しません。
◆ 大文字、小文字の区別が誤っている(UNIX)
UNIXというOSは通常、アルファベットの大文字と小文字を別の文字として扱いますので注意してください。たとえば、test1.cgi と TEST1.CGI はまったく別のファイルとして扱われます。
◆ ブラウザのキャッシングに惑わされている(共通)
ブラウザがCGIスクリプトの結果をキャッシングするために、スクリプトを書き換えても古い情報が表示されたりします。CGIスクリプト変更時には十分に注意して、再読み込みを欠かさないようにしましょう。
CGIスクリプトを記述する際に注意しなければならないことを、UNIXサーバーの場合、Windowsサーバーの場合に分けて説明します。(多くのプロバイダではUNIXサーバーを利用しています。たまにWindows NTサーバーもあるようです。)
◆ サーバーがCGIをサポートしていない(共通)
セキュリティ確保のためCGIの使用を禁止していたり、CGIの設定を行っていなかったりするため、CGIを利用できない場合があります。
◆ .htaccessファイルが必要?(UNIX)
サーバが Apache などの場合、.htaccess というファイルの設定が必要な場合があります。プロバイダやサーバー管理者に問い合わせてください。また、.htaccess に記述しても有効にならない場合もありますので、サーバーの管理者の指示に従ってください。
◆ ローカルファイルを実行しようとしてる(共通)
CGIスクリプトの動作チェックは必ず、http:// で始まるアドレスでアクセスしなくてはなりません。
◆ perlのパス名があっていない(UNIX)
CGIスクリプトの1行目は、perlの絶対パス名(ディレクトリ上の位置)を正確に指定してください。絶対パス名がわからない場合は、プロバイダの説明を読んだり、サーバーの管理者に問い合わせてください。多くの場合、/usr/local/bin/perl や、/usr/bin/perl などに置かれています。
◆ CGIスクリプトの場所が適切でない(共通)
サーバーの設定によってはCGIスクリプトを置くディレクトリが制限されている場合があります。普段 HTMLファイルを置いているのとは別のサーバーに設置しなくてはならないプロバイダもあります。CGIスクリプトを置く場所がこのホームページで説明されている場所と合わない場合は、プロバイダの指示などに従って、適切にディレクトリを変更してください。
◆ CGIスクリプトの拡張子が適切でない(共通)
CGIスクリプトの拡張子が .cgi でなくてはならない場合があります。他にも .pl でなくてはならない場合もあります。これらも、サーバーの設定によって異なります。
◆ perlがインストールされていない(Windows)
Windows NTにはperlが標準では装備されていませんから、perl for Win32 や ActivePerl を入手してインストールする必要があります。また、MicrosoftのIISを用いる場合は、.cgi という拡張子に対して perl.exe が起動されるように、IISのヘルプを参照して設定を行う必要があります。(古いバージョンのIISではレジストリの追加が必要)
◆ ユーザーの権限設定が誤っている(Windows)
MicrosoftのIISでは、IUSER_MachineName というユーザーの権限でコマンドが実行されます。このユーザーがCGIスクリプトを実行する権限を持っているか確認してください。
◆ ファイルの所有者が変(共通)
他のサーバーからデータファイルを移行させたときなど、ファイルの所有者が nobody でなくてはならないのに、自分自身の所有になっていて、パーミッションが 644 でもCGIがファイルに書き込めないことがあります。
◆ サーバーがCGIをサポートしていない(共通)
セキュリティ確保のためCGIの使用を禁止していたり、CGIの設定を行っていなかったりするため、CGIを利用できない場合があります。
◆ .htaccessファイルが必要?(UNIX)
サーバが Apache などの場合、.htaccess というファイルの設定が必要な場合があります。プロバイダやサーバー管理者に問い合わせてください。また、.htaccess に記述しても有効にならない場合もありますので、サーバーの管理者の指示に従ってください。
◆ ローカルファイルを実行しようとしてる(共通)
CGIスクリプトの動作チェックは必ず、http:// で始まるアドレスでアクセスしなくてはなりません。
◆ perlのパス名があっていない(UNIX)
CGIスクリプトの1行目は、perlの絶対パス名(ディレクトリ上の位置)を正確に指定してください。絶対パス名がわからない場合は、プロバイダの説明を読んだり、サーバーの管理者に問い合わせてください。多くの場合、/usr/local/bin/perl や、/usr/bin/perl などに置かれています。
◆ CGIスクリプトの場所が適切でない(共通)
サーバーの設定によってはCGIスクリプトを置くディレクトリが制限されている場合があります。普段 HTMLファイルを置いているのとは別のサーバーに設置しなくてはならないプロバイダもあります。CGIスクリプトを置く場所がこのホームページで説明されている場所と合わない場合は、プロバイダの指示などに従って、適切にディレクトリを変更してください。
◆ CGIスクリプトの拡張子が適切でない(共通)
CGIスクリプトの拡張子が .cgi でなくてはならない場合があります。他にも .pl でなくてはならない場合もあります。これらも、サーバーの設定によって異なります。
◆ perlがインストールされていない(Windows)
Windows NTにはperlが標準では装備されていませんから、perl for Win32 や ActivePerl を入手してインストールする必要があります。また、MicrosoftのIISを用いる場合は、.cgi という拡張子に対して perl.exe が起動されるように、IISのヘルプを参照して設定を行う必要があります。(古いバージョンのIISではレジストリの追加が必要)
◆ ユーザーの権限設定が誤っている(Windows)
MicrosoftのIISでは、IUSER_MachineName というユーザーの権限でコマンドが実行されます。このユーザーがCGIスクリプトを実行する権限を持っているか確認してください。
◆ ファイルの所有者が変(共通)
他のサーバーからデータファイルを移行させたときなど、ファイルの所有者が nobody でなくてはならないのに、自分自身の所有になっていて、パーミッションが 644 でもCGIがファイルに書き込めないことがあります。