<?xml version="1.0" encoding="UTF-8" ?>
<rss version="0.91">
  <channel>
    <title>ＣＧＩの学び舎</title>
    <description>ＣＧＩについて１から書いております</description>
    <link>https://cgimanabi.blog.shinobi.jp/</link>
    <language>ja</language>
    <copyright>Copyright (C) NINJATOOLS ALL RIGHTS RESERVED.</copyright>

    <item>
      <title>CGIのセキュリティについて</title>
      <description>SSIやCGIは便利さの代償としてセキュリティ上非常に危険なものです。以下の文章はセキュリティを強化するために必要な情報ですが、反面、未防御のシステムに対してアタックをかけるための情報にもなってしまいます。この場で記載すべきかどうか悩んだのですが、このホームページの読者を信用して公開することにしました。&lt;br /&gt;
&lt;br /&gt;
◆ index.htmlを設置する&lt;br /&gt;
CGIスクリプトを置くディレクトリには index.html を置いておきましょう。index.html が存在しない場合、cgi-bin ディレクトリをブラウザでみるとCGIスクリプトの一覧が見えてしまいます。ファイル名からセキュリティホールのあるスクリプトを見つけてアタックされる可能性が高くなります。&lt;br /&gt;
&lt;br /&gt;
◆ 見られるとまずいファイルはpublic_htmlの外に&lt;br /&gt;
パスワードファイルなど、見られるとまずいファイルは、public_htmlの外など、通常の閲覧者が見ることのできないディレクトリに置きましょう。(それでも、同じサーバーにログインできる人や、他の人のCGIのセキュリティホールのために、見られてしまうことはあります。)&lt;br /&gt;
&lt;br /&gt;
◆ evalの危険性&lt;br /&gt;
perlはよく分からないのでCGIスクリプトをシェルで記述しよう・・・と思った時など、CGIスクリプトのパラメータを解釈するためによく、UNIX のシェルの eval を利用しますが、これは大変危険です。もし、変数名NAMEの値として「値;危険なコマンド」を指定されると・・・&lt;br /&gt;
&lt;br /&gt;
◆ grepの危険性&lt;br /&gt;
「grep $KEY file」というコードも危険です。もし、KEYの値としてバッククォーテーション( ` )で囲まれた「`危険なコマンド`」を指定されると・・・&lt;br /&gt;
&lt;br /&gt;
◆ SSIの危険性&lt;br /&gt;
チャットや伝言板など利用者の書き込んだメッセージを表示するシステムではSSIに注意してください。もし、「&lt;!--#exec cmd=&quot;危険なコマンド&quot;--&gt;」を書き込まれると・・・&lt;br /&gt;
&lt;br /&gt;
◆ パスワード漏洩の危険性&lt;br /&gt;
人様のパスワードを扱う場合はとにかく厳重に扱ってください。多くの人は同じパスワードを使いまわします。あなたのサービスが不法使用されるだけでなく、同じパスワードを使いまわしていた他の有料サービスも不法使用される恐れがあります。あなたのCGIスクリプトは完璧でも、同じサーバー上の他の人の不備で情報が漏れる可能性もあります。パスワード情報ファイルに password.txt などといった安直な名前はつけないようにしましょう。&lt;br /&gt;
&lt;br /&gt;
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6</link> 
    </item>
    <item>
      <title>CGIスクリプト作成時の注意４</title>
      <description>◆ アットマーク（@）の扱い
Perl5でダブルクォーテーション（&amp;quot;...&amp;quot;）の間にアットマーク（@）を記述する場合は @ を \@ と記述する必要があります。Perl4の場合や、Perl5であってもシングルクォーテーション（'...'）であればそのまま @ と記述できます。

◆ 画像ファイルに広告データが挿入される
広告付きのサイトを利用している場合が、カウンターなどの画像データにまで、広告画像が自動的に挿入されてしまい、画像データが壊れてしまうケースがあるようです。対策は利用サーバのマニュアルなどを参照ください。

◆ Perlのバージョンが異なる
サイトによっては perl のバージョンが 3 や 4 など古いバージョンだったり、perl 5 を利用するには /usr/bin/perl5 や /usr/local/bin/perl5 のように指定する必要があるサイトもあるようです。

◆ CGIの仕様が一般と異なる
print &amp;quot;Content-Type: text/html\n\n&amp;quot;; の前に、print &amp;quot;HTTP/1.0 200 OK\n&amp;quot;; の追記が必要など、サイトによっては CGI の仕様が一般のものと多少異なる場合があるようです。
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E4%BD%9C%E6%88%90%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%EF%BC%94</link> 
    </item>
    <item>
      <title>CGIスクリプト作成時の注意３</title>
      <description>◆ ヘッダにスペルミスがある(共通)
意外に多いのがこれ。Context-type: になっていたり、test/html や type/html になっていたり....もう一度確認してみましょう。

◆ CGIスクリプトの出力漢字コードが変(共通)
CGIスクリプトから出力する漢字コードはJISコードにするのが無難です。通常はブラウザが自動判断するのですが、Windowsで使用されているシフトJISと、UNIXで使用されているEUCの場合は誤判断してしまうことがあります。

◆ ブラウザの漢字コード選択が変(共通)
EUCのファイルを書き出しているのに、ブラウザの文字コード選択([表示]-[エンコード])がシフトJISのままになっていて、うまく表示できないケースがあるようです。

◆ ファイルへの同時アクセスに注意(共通)
CGIスクリプトは複数のブラウザ(ひとつのブラウザからでも)同時に起動されます。CGIスクリプトからファイルを更新する際は、ロックファイルの生成などにより排他制御を行う必要があります。

◆ ブラウザの[画像表示]チェックがオフになっている(共通)
CGIを&amp;lt;img&amp;gt;タグから呼び出す場合、Netscapeの場合[オプション]→[画像の自動読み込み]、Internet Explorerの場合[表示]→[オプション]→[情報]→[画像の表示]がオンになっていないと読み込まれません。

◆ text/plain のわな(共通)
Content-type: text/plain を使用した場合、Internet Explorer 3.0以降ではうまく動かないことがあります。[表示]→[オプション]→[プログラム]→[ファイルタイプ]で、.cgiという拡張子のファイルにメモ帳などのプログラムを割り当てている場合、text/plain 形式の実行結果をダウンロードしてしまい、期待通りの動作をしないことがあります。

◆ カレントディレクトリの差異(Win)
Windows NT + IISの場合は、CGIスクリプトが動作する際のカレントディレクトリ(作業フォルダ)の場所が異なる場合があります。スクリプトの最初の方に、chdir(&amp;quot;C:/HomePage/cgi-bin&amp;quot;); などの1行(C:/～の部分にはCGIスクリプトを置いているフォルダを指定する)を追加することで回避できる場合があります。

◆ もう一度スペルチェック(共通)
すべて確認したのに、どうしても動かない・・・そういう時は、もう一度、すべてのスペルをチェックしてみましょう。大文字・小文字もあわせて見てください。l(小文字のエル)と I(大文字のアイ)と 1(数字の１)は間違えやすいので気を付けてください。
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E4%BD%9C%E6%88%90%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%EF%BC%93</link> 
    </item>
    <item>
      <title>CGIスクリプト作成時の注意２</title>
      <description>◆ .htaccessの改行コードが変(共通)
.htaccessを設置する場合は、.htaccessの改行コードもまた、サーバーのOSタイプにあわせてやる必要があります。

◆ .htaccessの最後の行が改行されていない
.htaccessの最後の行が改行されていないと、その行は無視されてしまうようです。

◆ CGIスクリプト内で使用するコマンドのパスが変(共通)
スクリプト実行時、スクリプト内で使用するコマンドのパス(PATH)が通っていない場合があります。TELNETなどでログインした時のPATHと、CGIスクリプトが実行される時のPATHは異なるので注意してください。コマンドはなるべくフルパスで記述したほうが無難かもしれません。

◆ 最初の１行が変(UNIX)
CGIスクリプトの最初の１行は「#!」で始めるようにしてください。CGIスクリプトは「#!」で始めなくてはなりません。「#!」の前に空白文字や空行があってもいけません。

◆ ヘッダ行のあとの空行が無い(共通)
Content-type: text/html などのCGIヘッダの後には必ず、1行以上の空行を出力してください。これを怠るとCGIスクリプトは正常に動作しません。

◆ 大文字、小文字の区別が誤っている(UNIX)
UNIXというOSは通常、アルファベットの大文字と小文字を別の文字として扱いますので注意してください。たとえば、test1.cgi と TEST1.CGI はまったく別のファイルとして扱われます。

◆ ブラウザのキャッシングに惑わされている(共通)
ブラウザがCGIスクリプトの結果をキャッシングするために、スクリプトを書き換えても古い情報が表示されたりします。CGIスクリプト変更時には十分に注意して、再読み込みを欠かさないようにしましょう。
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E4%BD%9C%E6%88%90%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F%EF%BC%92</link> 
    </item>
    <item>
      <title>CGIスクリプト作成時の注意</title>
      <description>CGIスクリプトを記述する際に注意しなければならないことを、UNIXサーバーの場合、Windowsサーバーの場合に分けて説明します。(多くのプロバイダではUNIXサーバーを利用しています。たまにWindows NTサーバーもあるようです。）&lt;br /&gt;
&lt;br /&gt;
◆ サーバーがCGIをサポートしていない(共通)&lt;br /&gt;
セキュリティ確保のためCGIの使用を禁止していたり、CGIの設定を行っていなかったりするため、CGIを利用できない場合があります。&lt;br /&gt;
&lt;br /&gt;
◆ .htaccessファイルが必要？(UNIX)&lt;br /&gt;
サーバが Apache などの場合、.htaccess というファイルの設定が必要な場合があります。プロバイダやサーバー管理者に問い合わせてください。また、.htaccess に記述しても有効にならない場合もありますので、サーバーの管理者の指示に従ってください。&lt;br /&gt;
&lt;br /&gt;
◆ ローカルファイルを実行しようとしてる(共通)&lt;br /&gt;
CGIスクリプトの動作チェックは必ず、http:// で始まるアドレスでアクセスしなくてはなりません。&lt;br /&gt;
&lt;br /&gt;
◆ perlのパス名があっていない(UNIX)&lt;br /&gt;
CGIスクリプトの1行目は、perlの絶対パス名（ディレクトリ上の位置）を正確に指定してください。絶対パス名がわからない場合は、プロバイダの説明を読んだり、サーバーの管理者に問い合わせてください。多くの場合、/usr/local/bin/perl や、/usr/bin/perl などに置かれています。&lt;br /&gt;
&lt;br /&gt;
◆ CGIスクリプトの場所が適切でない(共通)&lt;br /&gt;
サーバーの設定によってはCGIスクリプトを置くディレクトリが制限されている場合があります。普段 HTMLファイルを置いているのとは別のサーバーに設置しなくてはならないプロバイダもあります。CGIスクリプトを置く場所がこのホームページで説明されている場所と合わない場合は、プロバイダの指示などに従って、適切にディレクトリを変更してください。&lt;br /&gt;
&lt;br /&gt;
◆ CGIスクリプトの拡張子が適切でない(共通)&lt;br /&gt;
CGIスクリプトの拡張子が .cgi でなくてはならない場合があります。他にも .pl でなくてはならない場合もあります。これらも、サーバーの設定によって異なります。&lt;br /&gt;
&lt;br /&gt;
◆ perlがインストールされていない(Windows)&lt;br /&gt;
Windows NTにはperlが標準では装備されていませんから、perl for Win32 や ActivePerl を入手してインストールする必要があります。また、MicrosoftのIISを用いる場合は、.cgi という拡張子に対して perl.exe が起動されるように、IISのヘルプを参照して設定を行う必要があります。（古いバージョンのIISではレジストリの追加が必要）&lt;br /&gt;
&lt;br /&gt;
◆ ユーザーの権限設定が誤っている(Windows)&lt;br /&gt;
MicrosoftのIISでは、IUSER_MachineName というユーザーの権限でコマンドが実行されます。このユーザーがCGIスクリプトを実行する権限を持っているか確認してください。&lt;br /&gt;
&lt;br /&gt;
◆ ファイルの所有者が変(共通)&lt;br /&gt;
他のサーバーからデータファイルを移行させたときなど、ファイルの所有者が nobody でなくてはならないのに、自分自身の所有になっていて、パーミッションが 644 でもCGIがファイルに書き込めないことがあります。&lt;br /&gt;
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E4%BD%9C%E6%88%90%E6%99%82%E3%81%AE%E6%B3%A8%E6%84%8F</link> 
    </item>
    <item>
      <title>CGIデータのエンコード</title>
      <description>CGIスクリプトに渡すデータは、次のような規則にしたがってエンコード(符号化)しなくてはなりません。（フォームの場合はブラウザが自動的にエンコードしてくれます。）これを怠ると、~ が \~ に変換されてしまったり、日本語が化けてしまったりします。

スペースはプラス(+)に置き換える。 
特殊文字、日本語などはパーセント(%)に続く2桁の16進数に置き換える。 
CGIスクリプトの中では、これを適切な手段でデコードしてやらなくてはなりません。例えば、perlによるCGIスクリプトでは、次のようなコードでデータをデコードします。

$value =~ tr/+/ /;
$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack(&amp;quot;C&amp;quot;,hex($1))/eg;

</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89</link> 
    </item>
    <item>
      <title>CGIスクリプトへ渡すパラメータ</title>
      <description>CGI スクリプトにパラメータを渡すには以下のような方法があります。

◆ コマンドライン引数で渡す

以下のような形式で CGI スクリプトを呼び出すことにより渡します。引数1、引数2が CGI スクリプトのコマンドライン引数になります。Perl の場合、これらの引数は配列 @ARGV や、環境変数 QUERY_STRING から読み出します。サーバーによっては、環境変数 @ARGV は参照できない場合もあります。

http://...../cgi-bin/xxx.cgi?引数1+引数2

引数に日本語や特殊記号を用いる場合は、適切なエンコードを行う必要があります。エンコード方式は、呼び出し側と CGI 側で整合がとれていれば %nn 形式でも BASE64 形式でもなんでも構いません。

ダブルクォート（&amp;quot;）や感嘆符（!）など、引数に、UNIX のシェルで意味を持つ記号が含まれていると、\&amp;quot; や \! のように、バックスラッシュ（\）でエスケープされてしまうことがありますので注意してください。

◆ METHOD=GETで渡す

次のような形式でCGIスクリプトに渡します。CGIスクリプトは、これを環境変数の QUERY_STRING から読み出します。

http://...../cgi-bin/xxx.cgi?名前1=値1&amp;amp;名前2=値2

フォームから METHOD=GET で呼び出した場合も、この形式でデータが渡されます。この場合、記号などは %nn 形式に適切にエンコードされます。

環境変数のサイズには上限があるので、大きなデータを転送する時は METHOD=POST を用います。

◆ URLにスラッシュ(/)をつけて渡す

以下のような形式で CGI スクリプトを呼び出すこともできます。/引数1/引数2 の部分を環境変数 PATH_INFO で読み取ります。

http://...../cgi-bin/xxx.cgi/引数1/引数2

◆ METHOD=POSTで渡す

フォームから METHOD=POST で呼び出した場合は、データはURLではなく、標準入出力で渡されます。CGIスクリプトは、これを環境変数の CONTENT_LENGTH 分、標準入力（STDIN）から読み出します。

http://...../cgi-bin/xxx.cgi
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%B8%E6%B8%A1%E3%81%99%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF</link> 
    </item>
    <item>
      <title>CGIスクリプトが書き出すヘッダ情報</title>
      <description>Content-type: TypeName 
最もよく使われる形式です。TypeNameにはMIMEタイプと呼ばれる名前を指定します。MIMEタイプには次のようなものがあります。

text/html ... HTML文書 
text/plain ... べた文書 
image/gif ... GIFファイル 
image/jpeg ... JPEGファイル 
video/mpeg ... MPEGファイル 
通常のテキストを表示する場合は、Microsoft Internet Explorer 3.0では、text/plain をうまく解釈できないことがありますので、text/htmlとしたほうが無難なようです。
 

Location: UrlName 
指定したURLにジャンプします。URLを http:// ではじまる完全URLで指定してください。

(例)
#!/usr/local/bin/perl
print &amp;quot;Location: http://xxx.yyy.zzz/\n&amp;quot;;
print &amp;quot;\n&amp;quot;;


Status: StatusCode 
ブラウザに状態コードを返します。
 
出力の2行目(正確に言うと、ヘッダ情報が完了した次の行)は必ず空白行にしてください。これを怠ると、CGIスクリプトは動作しません。
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8C%E6%9B%B8%E3%81%8D%E5%87%BA%E3%81%99%E3%83%98%E3%83%83%E3%83%80%E6%83%85%E5%A0%B1</link> 
    </item>
    <item>
      <title>CGIを呼び出す</title>
      <description>サーバーに転送したCGIスクリプトを、通常のHTMLファイルと同様に、例えば次のようなURLを指定してブラウザから呼び出してください。「これはCGIのテストです。」と表示されれば、設置は完了です。

http://www2e.biglobe.ne.jp/~s-hasei/test1.cgi

#!/usr/local/bin/perl や、print &amp;quot;...&amp;quot; などのCGIスクリプトがそのまま見えてしまう場合は、サーバーがCGIをサポートしていないか、.htaccess ファイルの設置が必要であるなどを意味しています。

サーバー上に設置して、http://～ で始まるURLで呼び出さないとCGIは動作しませんので注意してください。
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99</link> 
    </item>
    <item>
      <title>CGIのパーミッションを変更する</title>
      <description>サーバーがUNIXの場合は（現在は多くのサーバーがUNIXです。）、CGIスクリプトのファイルのパーミッションを変更する必要があります。
CGIスクリプトのパーミッションを 755 （rwxr-xr-x） に変更してください。
</description> 
      <link>https://cgimanabi.blog.shinobi.jp/%E6%9C%AA%E9%81%B8%E6%8A%9E/cgi%E3%81%AE%E3%83%91%E3%83%BC%E3%83%9F%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B</link> 
    </item>

  </channel>
</rss>