Perl-cgi-programming

提供:Dev Guides
移動先:案内検索

Perl-CGIプログラミング

CGIとは何ですか?

  • Common Gateway Interface(CGI)は、Webサーバーとカスタムスクリプトの間で情報を交換する方法を定義する一連の標準です。
  • CGIの仕様は現在NCSAによって維持されており、NCSAは次のようにCGIを定義しています-
  • Common Gateway Interface(CGI)は、外部ゲートウェイプログラムがHTTPサーバーなどの情報サーバーとインターフェイスするための標準です。
  • 現在のバージョンはCGI/1.1で、CGI/1.2は進行中です。

ウェブブラウジング

CGIの概念を理解するために、特定のWebページまたはURLを閲覧するためにWebページで利用可能なハイパーリンクをクリックするとどうなるかを見てみましょう。

  • ブラウザは、HTTPプロトコルを使用してWebサーバーにアクセスし、URL、つまりWebページのファイル名を要求します。
  • WebサーバーはURLをチェックし、要求されたファイル名を探します。 Webサーバーがそのファイルを見つけると、それ以上実行せずにファイルをブラウザーに送ります。そうしないと、間違ったファイルを要求したことを示すエラーメッセージを送信します。
  • WebブラウザはWebサーバーからの応答を受け取り、ファイルが見つからない場合は、受信したファイルコンテンツまたはエラーメッセージを表示します。

ただし、特定のディレクトリ内のファイルが要求されるたびにそのファイルが送り返されないように、HTTPサーバーを設定することは可能です。代わりに、プログラムとして実行され、そのプログラムが結果として出力するものは何でも、ブラウザに戻されて表示されます。 これは、Webサーバーで使用可能な特別な機能を使用して実行できます。 Common Gateway Interface またはCGIと呼ばれ、最終結果を生成するためにサーバーによって実行されるプログラムはCGIスクリプトと呼ばれます。 これらのCGIプログラムは、PERLスクリプト、シェルスクリプト、CまたはC ++プログラムなどです。

CGIアーキテクチャ図

CGIアーキテクチャ

Webサーバーのサポートと構成

CGIプログラミングに進む前に、WebサーバーがCGI機能をサポートし、CGIプログラムを処理するように構成されていることを確認してください。 Webサーバーによって実行されるすべてのCGIプログラムは、事前に構成されたディレクトリに保持されます。 このディレクトリはCGIディレクトリと呼ばれ、慣例により/cgi-binと名付けられます。 慣例により、Perl CGIファイルの拡張子は .cgi になります。

最初のCGIプログラム

link:/cgi-bin/hello.cgi [hello.cgi]と呼ばれるCGIスクリプトにリンクされている簡単なリンクを次に示します。 このファイルは /cgi-bin/ ディレクトリに保存されており、次の内容が含まれています。 CGIプログラムを実行する前に、 chmod 755 hello.cgi UNIXコマンドを使用してファイルの変更モードがあることを確認してください。

#!/usr/bin/perl

print "Content-type:text/html\r\n\r\n";
print '<html>';
print '<head>';
print '<title>Hello Word - First CGI Program</title>';
print '</head>';
print '<body>';
print '<h2>Hello Word! This is my first CGI program</h2>';
print '</body>';
print '</html>';

1;
*hello.cgi* リンクをクリックすると、/cgi-binディレクトリでhello.cgiを検索するWebサーバーにリクエストが送信され、実行され、結果が生成された場合、Webサーバーはその結果をWebブラウザーに送信します。次のように-
Hello Word! This is my first CGI program

このhello.cgiスクリプトは、出力をSTDOUTファイル、つまり画面に書き込む単純なPerlスクリプトです。 印刷される最初の行である Content-type:text/html \ r \ n \ r \ n という重要で追加の機能が1つあります。 この行はブラウザに送り返され、ブラウザ画面に表示されるコンテンツタイプを指定します。 CGIの基本概念を理解している必要があり、Perlを使用して多くの複雑なCGIプログラムを作成できます。 このスクリプトは、データベース、Webサービス、またはその他の複雑なインターフェイスなどの情報を交換するために、他の労力を要するシステムとも対話できます。

HTTPヘッダーについて

最初の行の Content-type:text/html \ r \ n \ r \ n はHTTPヘッダーの一部であり、ブラウザーがサーバー側からの着信コンテンツを理解できるようにブラウザーに送信されます。 すべてのHTTPヘッダーは次の形式になります-

HTTP Field Name: Field Content

例-

Content-type:text/html\r\n\r\n

CGIプログラミングで頻繁に使用する他の重要なHTTPヘッダーはほとんどありません。

Sr.No. Header & Description
1

Content-type: String

返されるコンテンツの形式を定義するMIME文字列。 例はContent-type:text/htmlです

2

Expires: Date String

情報が無効になる日付。 これは、ブラウザがページを更新する必要がある時期を決定するために使用する必要があります。 有効な日付文字列は、1998年1月1日12:00:00 GMTの形式である必要があります。

3

Location: URL String

要求されたURLの代わりに返されるURL。 このフィールドを使用して、リクエストを他の場所にリダイレクトできます。

4

Last-modified: String

ファイルの最終変更日。

5

Content-length: String

返されるデータの長さ(バイト単位)。 ブラウザはこの値を使用して、ファイルの推定ダウンロード時間を報告します。

6

Set-Cookie: String

_string_を介して渡されるCookieを設定します

CGI環境変数

すべてのCGIプログラムは、次の環境変数にアクセスできます。 これらの変数は、CGIプログラムの作成中に重要な役割を果たします。

Sr.No. Variables Names & Description
1

CONTENT_TYPE

コンテンツのデータ型。 クライアントが添付コンテンツをサーバーに送信するときに使用されます。 たとえば、ファイルのアップロードなど。

2

CONTENT_LENGTH

クエリ情報の長さ。 POSTリクエストでのみ利用可能です

3

HTTP_COOKIE

設定されたCookieをキーと値のペアの形式で返します。

4

HTTP_USER_AGENT

User-Agent request-headerフィールドには、リクエストを発信したユーザーエージェントに関する情報が含まれています。 Webブラウザーの名前。

5

PATH_INFO

CGIスクリプトのパス。

6

QUERY_STRING

GETメソッド要求で送信されるURLエンコードされた情報。

7

REMOTE_ADDR

要求を行っているリモートホストのIPアドレス。 これは、ロギングまたは認証の目的に役立ちます。

8

REMOTE_HOST

要求を行っているホストの完全修飾名。 この情報が利用できない場合、REMOTE_ADDRを使用してIRアドレスを取得できます。

9

REQUEST_METHOD

要求を行うために使用されるメソッド。 最も一般的なメソッドはGETおよびPOSTです。

10

SCRIPT_FILENAME

CGIスクリプトへのフルパス。

11

SCRIPT_NAME

CGIスクリプトの名前。

12

SERVER_NAME

サーバーのホスト名またはIPアドレス。

13

SERVER_SOFTWARE

サーバーが実行しているソフトウェアの名前とバージョン。

以下は、WebサーバーでサポートされているすべてのCGI変数をリストする小さなCGIプログラムです。 このリンクをクリックして結果を確認してくださいhttps://www.finddevguides.com/cgi-bin/get_env.cgi[Get Environment]

#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<font size=+1>Environment</font>\n";
foreach (sort keys %ENV) {
   print "<b>$_</b>: $ENV{$_}<br>\n";
}

1;

[ファイルのダウンロード]ダイアログボックスを表示しますか?

ユーザーがリンクをクリックし、実際のコンテンツを表示する代わりに、「ファイルのダウンロード」ダイアログボックスをユーザーに表示するオプションを提供したい場合があります。 これは非常に簡単で、HTTPヘッダーを介して実現されます。

このHTTPヘッダーは、前のセクションで説明したヘッダーとは異なります。 たとえば、特定のリンクから FileName ファイルをダウンロード可能にしたい場合、その構文は次のようになります-

#!/usr/bin/perl

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go hear.
open( FILE, "<FileName" );
while(read(FILE, $buffer, 100) ) {
   print("$buffer");
}

GETおよびPOSTメソッド

ブラウザからWebサーバーに、そして最終的にはリクエストを処理するCGIプログラムに情報を渡す必要がある場合、多くの状況に遭遇したに違いありません。 ほとんどの場合、ブラウザは2つの方法を使用してこの情報をWebサーバーに渡します。 これらのメソッドは GET メソッドと POST メソッドです。 それらを一つ一つ確認しましょう。

GETメソッドを使用して情報を渡す

GETメソッドは、エンコードされたユーザー情報をページURL自体に追加して送信します。 ページとエンコードされた情報は、? 次のような文字-

http://www.test.com/cgi-bin/hello.cgi?key1=value1&key2=value2

GETメソッドは、ブラウザーからWebサーバーに情報を渡すdefualtメソッドであり、ブラウザーのLocation:boxに表示される長い文字列を生成します。 サーバーに渡すパスワードやその他の機密情報がある場合は、GETメソッドを使用しないでください。 GETメソッドにはサイズ制限があります。リクエスト文字列で渡すことができるのは1024文字のみです。

この情報は QUERY_STRING ヘッダーを使用して渡され、CGIプログラムで解析して使用できるQUERY_STRING環境変数を介してCGIプログラムでアクセスできます。

キーと値のペアを任意のURLと連結するだけで情報を渡すことができます。または、HTML <FORM>タグを使用して、GETメソッドを使用して情報を渡すことができます。

単純なURLの例:Getメソッド

GETメソッドを使用してhello_get.cgiプログラムに2つの値を渡す簡単なURLを次に示します。

リンク:/cgi-bin/hello_get.cgi?first_name = ZARA&last_name = ALI [http://www.finddevguides.com/cgi-bin/hello_get.cgi?first_name=ZARA&last_name=ALI]

以下は、Webブラウザからの入力を処理する hello_get.cgi スクリプトです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+//;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name  = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

単純なFORMの例:GETメソッド

HTML FORMと送信ボタンを使用して2つの値を渡す簡単な例を次に示します。 この入力を処理するために、同じCGIスクリプトhello_get.cgiを使用します。

<FORM action = "/cgi-bin/hello_get.cgi" method = "GET">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">
<input type = "submit" value = "Submit">
</FORM>

上記のフォームコーディングの実際の出力を次に示します。 これで、姓と名を入力し、送信ボタンをクリックして結果を確認できます。

名前苗字:

POSTメソッドを使用して情報を渡す

CGIプログラムに情報を渡すより信頼性の高い方法は、 POST メソッドです。 これは、GETメソッドとまったく同じ方法で情報をパッケージ化しますが、URLの*?*の後にテキスト文字列として送信する代わりに、HTTPヘッダーの一部として別のメッセージとして送信します。 Webサーバーは、このメッセージを標準入力の形式でCGIスクリプトに提供します。

以下は、Webブラウザーからの入力を処理するために変更された hello_post.cgi スクリプトです。 このスクリプトは、GETメソッドとPOSTメソッドを処理します。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+//;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$first_name = $FORM{first_name};
$last_name  = $FORM{last_name};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $first_name $last_name - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

上記と同じ例をもう一度見てみましょう。これは、HTML FORMと送信ボタンを使用して2つの値を渡します。 この入力を処理するには、CGIスクリプトhello_post.cgiを使用します。

<FORM action = "/cgi-bin/hello_post.cgi" method = "POST">
First Name: <input type = "text" name = "first_name">  <br>

Last Name: <input type = "text" name = "last_name">

<input type = "submit" value = "Submit">
</FORM>

上記のフォームコーディングの実際の出力を次に示します。名と姓を入力し、[送信]ボタンをクリックして結果を確認します。

名前苗字:

チェックボックスデータをCGIプログラムに渡す

チェックボックスは、複数のオプションを選択する必要がある場合に使用されます。 以下に、2つのチェックボックスがあるフォームのHTMLコードの例を示します。

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
<input type = "checkbox" name = "maths" value = "on"> Maths
<input type = "checkbox" name = "physics" value = "on"> Physics
<input type = "submit" value = "Select Subject">
</form>

このコードの結果は次の形式です-

数学物理学

以下は、ラジオボタンのWebブラウザーからの入力を処理する checkbox.cgi スクリプトです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+//;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
if( $FORM{maths} ) {
   $maths_flag ="ON";
} else {
   $maths_flag ="OFF";
}
if( $FORM{physics} ) {
   $physics_flag ="ON";
} else {
   $physics_flag ="OFF";
}

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Checkbox - Third CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> CheckBox Maths is : $maths_flag</h2>";
print "<h2> CheckBox Physics is : $physics_flag</h2>";
print "</body>";
print "</html>";

1;

ラジオボタンデータをCGIプログラムに渡す

オプションを1つだけ選択する必要がある場合は、ラジオボタンが使用されます。 これは、2つのラジオボタンがあるフォームのHTMLコードの例です-

<form action = "/cgi-bin/radiobutton.cgi" method = "POST" target = "_blank">
<input type = "radio" name = "subject" value = "maths"> Maths
<input type = "radio" name = "subject" value = "physics"> Physics
<input type = "submit" value = "Select Subject">
</form>

このコードの結果は次の形式です-

数学物理学

以下は、ラジオボタン用にWebブラウザから与えられた入力を処理する radiobutton.cgi スクリプトです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+//;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$subject = $FORM{subject};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Radio - Fourth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

テキスト領域データをCGIプログラムに渡す

textarea要素は、複数行のテキストをCGIプログラムに渡す必要がある場合に使用されます。 ここにTEXTAREAボックスを持つフォームのHTMLコードの例があります-

<form action = "/cgi-bin/textarea.cgi" method = "POST" target = "_blank">
<textarea name = "textcontent" cols = 40 rows = 4>
Type your text here...
</textarea>
<input type = "submit" value = "Submit">
</form>

このコードの結果は次の形式です-

以下は、Webブラウザからの入力を処理する textarea.cgi スクリプトです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+//;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$text_content = $FORM{textcontent};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Entered Text Content is $text_content</h2>";
print "</body>";
print "</html>";

1;

ドロップダウンボックスデータをCGIプログラムに渡す

ドロップダウンボックスは、使用可能なオプションが多数あるが、1つまたは2つだけが選択される場合に使用されます。 これは、ドロップダウンボックスが1つあるフォームのHTMLコードの例です

<form action = "/cgi-bin/dropdown.cgi" method = "POST" target = "_blank">
<select name = "dropdown">
<option value = "Maths" selected>Maths</option>
<option value = "Physics">Physics</option>
</select>
<input type = "submit" value = "Submit">
</form>

このコードの結果は次の形式です-

数学物理学

以下は、Webブラウザからの入力を処理する dropdown.cgi スクリプトです。

#!/usr/bin/perl

local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
   ($name, $value) = split(/=/, $pair);
   $value =~ tr/+//;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
$subject = $FORM{dropdown};

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Dropdown Box - Sixth CGI Program</title>";
print "</head>";
print "<body>";
print "<h2> Selected Subject is $subject</h2>";
print "</body>";
print "</html>";

1;

CGIでのCookieの使用

HTTPプロトコルはステートレスプロトコルです。 ただし、商用Webサイトの場合は、異なるページ間でセッション情報を維持する必要があります。 たとえば、多くのページにまたがるトランザクションの後、1人のユーザー登録が終了します。 しかし、すべてのWebページにわたってユーザーのセッション情報を維持する方法は?

多くの場合、Cookieの使用は、ユーザーの利便性やサイトの統計情報を改善するために必要な設定、購入、手数料、その他の情報を記憶および追跡する最も効率的な方法です。

使い方

サーバーは、Cookieの形式で訪問者のブラウザにデータを送信します。 ブラウザはCookieを受け入れる場合があります。 存在する場合、訪問者のハードドライブにプレーンテキストレコードとして保存されます。 これで、訪問者がサイトの別のページに到達すると、Cookieを取得できます。 取得されると、サーバーは保存された内容を認識/記憶します。

クッキーは5つの可変長フィールドのプレーンテキストデータレコードです-

  • 有効期限-Cookieの有効期限が切れる日付。 これが空白の場合、訪問者がブラウザを終了すると、Cookieは期限切れになります。
  • ドメイン-サイトのドメイン名。
  • Path -Cookieを設定するディレクトリまたはWebページへのパス。 任意のディレクトリまたはページからCookieを取得する場合、これは空白になる場合があります。
  • 安全-このフィールドに「安全」という単語が含まれている場合、Cookieは安全なサーバーでのみ取得できます。 このフィールドが空白の場合、そのような制限はありません。
  • 名前=値-Cookieはキーと値のペアの形式で設定および再表示されます。

クッキーを設定する

クッキーをブラウザに送信するのは非常に簡単です。 これらのCookieは、HTTPヘッダーとともに送信されます。 ユーザーIDとパスワードをCookieとして設定するとします。 だから、次のように行われます-

#!/usr/bin/perl

print "Set-Cookie:UserID = XYZ;\n";
print "Set-Cookie:Password = XYZ123;\n";
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT";\n";
print "Set-Cookie:Domain = www.finddevguides.com;\n";
print "Set-Cookie:Path =/perl;\n";
print "Content-type:text/html\r\n\r\n";
...........Rest of the HTML Content goes here....

ここでは、 Set-Cookie HTTPヘッダーを使用してCookieを設定しました。 Expires、Domain、PathなどのCookie属性を設定することはオプションです。 マジックライン "Content-type:text/html \ r \ n \ r \ n を送信する前にCookieが設定されることに注意することが重要です。

Cookieを取得する

設定されたすべてのCookieを取得するのは非常に簡単です。 クッキーはCGI環境変数HTTP_COOKIEに保存され、次の形式になります。

key1 = value1;key2 = value2;key3 = value3....

Cookieを取得する方法の例を次に示します。

#!/usr/bin/perl
$rcvd_cookies = $ENV{'HTTP_COOKIE'};
@cookies = split/;/, $rcvd_cookies;
foreach $cookie ( @cookies ) {
   ($key, $val) = split(/=/, $cookie); # splits on the first =.
   $key =~ s/^\s+//;
   $val =~ s/^\s+//;
   $key =~ s/\s+$//;
   $val =~ s/\s+$//;
   if( $key eq "UserID" ) {
      $user_id = $val;
   } elsif($key eq "Password") {
      $password = $val;
   }
}
print "User ID  = $user_id\n";
print "Password = $password\n";

上記のCookieが検索Cookieスクリプトを呼び出す前に設定されている場合、これにより次の結果が生成されます。

User ID = XYZ
Password = XYZ123

CGIモジュールとライブラリ

インターネットには、CGIプログラムで使用する機能を直接提供する多くの組み込みモジュールがあります。 以下はかつて重要です。