はい、承知いたしました。Perl CGIを始める初心者向けの記事を、詳細な説明とサンプルコードを含め、約5000語で記述します。
以下が記事内容です。
【初心者向け】Perl CGIの始め方とサンプルコード: ウェブアプリケーション開発の基礎を学ぼう
はじめに
ウェブサイトは、静的なHTMLページだけでなく、ユーザーの入力に応じて内容が変化したり、データベースと連携したりする動的なコンテンツで溢れています。このような動的なウェブアプリケーションを開発するための技術の一つに、「CGI(Common Gateway Interface)」があります。そして、そのCGIを使ったウェブ開発において、かつて非常に広く使われていた言語が「Perl」です。
現在、Perl CGIは最新のウェブ開発の主流ではありませんが、その基本的な仕組みを理解することは、ウェブサーバーとスクリプトがどのように連携して動的なページを生成するのか、ウェブ開発の根幹を学ぶ上で非常に有益です。また、多くの古いシステムや既存のウェブサイトでは、いまだにPerl CGIが使われています。これらのシステムを理解し、保守するためにも、Perl CGIの知識は役立ちます。
この記事は、プログラミング初心者、特にウェブ開発の動的な仕組みに触れるのが初めての方を対象としています。Perlの基本的な文法は知っているか、あるいは同時に学ぶ意欲がある方を想定しています。約5000語のボリュームで、Perl CGIの概念から環境構築、基本的なスクリプトの書き方、データの受け渡し、そしてセキュリティの初歩まで、体系的に詳しく解説します。
この記事を読むことで、以下のことができるようになります。
- CGIの基本的な仕組みを理解する。
- PerlがどのようにCGIで使われるのかを知る。
- ウェブサーバー(Apacheを例に)でPerl CGIを実行するための環境を構築する。
- 簡単なPerl CGIスクリプトを作成し、実行する。
- ウェブブラウザからの入力(GETおよびPOSTメソッド)をPerlスクリプトで受け取る。
- 基本的なデバッグ方法を学ぶ。
- Perl CGIの学習をさらに深めるための道筋を知る。
ウェブ開発の基礎をしっかりと学びたい方、あるいはPerl CGIがどのように動くのか知りたい方は、ぜひ最後までお読みください。
第1章:ウェブテクノロジーの基礎知識(おさらい)
Perl CGIについて学ぶ前に、ウェブがどのように動いているのか、基本的な仕組みをおさらいしておきましょう。
1.1 クライアントとサーバー
ウェブの世界では、「クライアント」と「サーバー」という役割があります。
- クライアント: ウェブブラウザ(Chrome, Firefox, Safariなど)のことです。ユーザーが操作し、サーバーに情報を要求(リクエスト)します。
- サーバー: ウェブサイトのデータ(HTMLファイル、画像、プログラムなど)を保管しているコンピューターのことです。クライアントからの要求に応答(レスポンス)として情報を返します。
あなたがウェブサイトを見るとき、ブラウザ(クライアント)は特定のURLを使って、そのサイトのデータを持っているウェブサーバーに「このページを見せてください」というリクエストを送ります。サーバーは、そのリクエストに対応するデータを見つけ、ブラウザに送り返します。ブラウザはそのデータを受け取って、画面に表示します。
1.2 HTTPプロトコル
クライアントとサーバーが情報のやり取りをするためのルールが「HTTP(Hypertext Transfer Protocol)」です。ブラウザがサーバーにリクエストを送る時も、サーバーがブラウザにレスポンスを返す時も、このHTTPというルールに従っています。
HTTPリクエストには、どのような操作をしたいかを示す「メソッド」があります。代表的なものに以下の二つがあります。
- GET: サーバーから情報を取得したいときに使われます。ウェブサイトのページを表示する際や、検索結果を表示する際などによく使われます。送りたいデータはURLの一部(クエリ文字列)としてサーバーに送られます。
- POST: サーバーにデータを送信し、何らかの処理を行わせたいときに使われます。例えば、お問い合わせフォームから内容を送信したり、ログイン情報を送信したりする際に使われます。送りたいデータはリクエストの本体(ボディ)に含めて送られます。
HTTPレスポンスには、リクエストが成功したか失敗したかなどを示す「ステータスコード」(例: 200 OK, 404 Not Found, 500 Internal Server Errorなど)や、返されるデータの種類(HTMLなのか画像なのかなど)を示す「ヘッダー」、そして実際のデータである「ボディ」が含まれます。
1.3 静的コンテンツと動的コンテンツ
ウェブサイトには、大きく分けて「静的コンテンツ」と「動的コンテンツ」があります。
- 静的コンテンツ: 誰が見ても、いつ見ても同じ内容が表示されるコンテンツです。HTMLファイル、画像ファイル、CSSファイル、JavaScriptファイルなどがこれにあたります。サーバーはこれらのファイルをクライアントにそのまま送信します。
- 動的コンテンツ: アクセスするユーザーやタイミング、あるいはユーザーの入力によって表示内容が変わるコンテンツです。例えば、ログイン後の会員向けページ、最新情報が表示されるニュースサイト、検索結果ページ、オンラインショッピングサイトの商品ページなどがこれにあたります。これらのコンテンツは、サーバー上でプログラムが実行され、その結果に基づいて生成されます。
Perl CGIは、この動的コンテンツを生成するための技術の一つです。
第2章:CGI(Common Gateway Interface)とは?
ウェブサーバーが静的ファイルを返すだけなら話は簡単です。しかし、動的なコンテンツを生成するためには、サーバーは「プログラムを実行する」という能力が必要です。CGIは、ウェブサーバーが外部のプログラム(スクリプト)を実行し、そのプログラムとデータをやり取りするための「共通の仕組み(インターフェース)」を定めたものです。
2.1 CGIの役割
CGIの主な役割は以下の通りです。
- クライアントからの情報をプログラムに渡す: ウェブサーバーは、クライアントから受け取ったリクエストに含まれる情報(URL、GETパラメータ、POSTデータ、ブラウザの種類など)を、CGIのルールに従ってプログラムに渡します。これは主に「環境変数」や「標準入力(STDIN)」という形で渡されます。
- プログラムの実行結果をクライアントに返す: プログラムが生成した出力(主にHTML)をウェブサーバーが受け取り、それにHTTPヘッダーなどを付け加えて、クライアント(ブラウザ)にレスポンスとして返します。プログラムは結果を「標準出力(STDOUT)」に出力します。
2.2 CGIの仕組み(処理の流れ)
クライアントがCGIスクリプトへのURLにアクセスしたときの、CGIの処理の流れを見てみましょう。
- クライアントからのリクエスト: ウェブブラウザが、ウェブサーバーにあるCGIスクリプトのURLにアクセスします(例:
http://yourserver.com/cgi-bin/script.pl
)。 - サーバーがリクエストを受け取る: ウェブサーバー(例: Apache)がリクエストを受け取ります。
- CGIスクリプトを特定: サーバーは、リクエストされたURLがCGIスクリプトであることを認識します(これはサーバーの設定によって行われます)。
- 新しいプロセスを起動: サーバーは、リクエストに対応するCGIスクリプトを実行するために、新しいプロセス(Perlインタープリタなど)を起動します。
- 情報をプログラムに引き渡す: サーバーは、HTTPリクエストに含まれる様々な情報(GETパラメータ、POSTデータ、ヘッダー情報など)を、環境変数や標準入力として、起動したスクリプトのプロセスに渡します。
- スクリプトの実行: 起動されたPerlスクリプトが実行されます。スクリプトは渡された情報を元に処理を行います(計算、データベースアクセス、ファイル処理など)。
- 結果を標準出力に出力: スクリプトは、処理結果としてブラウザに表示させたい内容(HTTPヘッダーとHTMLなど)を標準出力(STDOUT)に出力します。
- サーバーが出力を受け取る: ウェブサーバーは、スクリプトの標準出力からすべてのデータを受け取ります。
- レスポンスを生成: サーバーは受け取ったデータ(特にヘッダー)を確認し、必要に応じて自身のHTTPヘッダー(例: Date, Serverなど)を追加して、完全なHTTPレスポンスを生成します。
- クライアントにレスポンスを送信: サーバーは生成したHTTPレスポンスをブラウザに送信します。
- ブラウザが表示: ブラウザはレスポンスを受け取り、HTMLを解析して画面に表示します。
- プロセスの終了: CGIスクリプトを実行したプロセスは、出力を終えた後、終了します。
ポイント: CGIの最大の特徴は、リクエストがあるたびに新しいプロセスが起動されることです。これは仕組みがシンプルで理解しやすいというメリットがある一方で、後述するパフォーマンスの問題につながります。
第3章:なぜCGIにPerlが使われたのか?
Perlは、CGIが広く使われ始めた初期の頃から、ウェブ開発の分野で非常に人気がありました。その理由をいくつか見てみましょう。
- 強力なテキスト処理能力: Perlは元々、テキストファイルの処理やレポート生成のために開発された言語です。ウェブのコンテンツの大部分はテキスト(HTML)であり、リクエスト/レスポンスのヘッダーもテキストです。Perlの得意とする正規表現や文字列操作は、HTML生成、データの解析、ログ処理など、CGIスクリプトが必要とする多くのタスクに非常に適していました。
- 豊富なライブラリ(CPAN): PerlにはCPAN (Comprehensive Perl Archive Network) と呼ばれる膨大な数のサードパーティ製ライブラリがあります。ウェブ開発に必要な機能(CGIパラメータの解析、データベース接続、HTML生成、ネットワーク通信など)を提供するモジュールが多数存在し、開発効率を高めました。特に、
CGI.pm
という標準的なモジュールは、CGI開発を非常に容易にしました。 - 柔軟性と記述の自由度: Perlは「やりたいことをやるための複数の方法がある」という哲学を持っており、開発者は比較的自由にコードを書くことができました。これは、素早くプロトタイプを作成したり、特定のタスクに特化したスクリプトを書いたりするのに便利でした。(ただし、これはコードの可読性が低くなるという側面もありました)。
- サーバー環境での普及: 当時(特に1990年代後半から2000年代初頭)、Unix/Linux系のサーバー環境ではPerlが標準的にインストールされていることが多く、追加のソフトウェアをインストールする手間が少なかったことも普及を後押ししました。
しかし、前述の通り、Perl CGIには「リクエストごとにプロセスを起動・終了する」というオーバーヘッドによるパフォーマンスの課題がありました。ウェブサイトへのアクセスが増加するにつれて、この課題は無視できなくなり、より効率的な代替技術(FastCGI, mod_perl, そしてRuby on RailsやDjango、Node.jsといったアプリケーションフレームワーク)が登場し、主流となっていきました。
それでも、Perl CGIの基本的な仕組みを学ぶことは、動的ウェブアプリケーションの「最もシンプルな」形態を理解することであり、その後のより高度な技術を学ぶ上での土台となります。
第4章:Perl CGI実行環境のセットアップ
Perl CGIスクリプトを実行するためには、いくつかの準備が必要です。
- ウェブサーバー: CGIスクリプトを実行できるウェブサーバーが必要です。ここでは最も一般的なApache HTTP Serverを例に説明します。
- Perlインタープリタ: サーバーにPerlがインストールされている必要があります。
- サーバーの設定: ウェブサーバーが、特定のディレクトリにあるファイルや特定の拡張子のファイルをCGIスクリプトとして認識し、実行できるように設定する必要があります。
- ファイル権限: CGIスクリプトファイルに、サーバーが実行するための適切な権限を与える必要があります。
4.1 ウェブサーバー (Apache) の準備
多くのLinuxディストリビューションやmacOSにはApacheがプリインストールされているか、パッケージマネージャーで簡単にインストールできます。WindowsでもXAMPPやWampServerといったツールを使えば、Apache、Perl、その他の開発環境を一括でインストールできます。
Apacheのインストールや基本的な起動・停止方法は、お使いのOSや環境によって異なりますので、ここでは詳細には触れませんが、Apacheが動作している状態を前提とします。
4.2 Perlインタープリタの確認とインストール
サーバーにPerlがインストールされているか確認するには、ターミナルやコマンドプロンプトを開いて以下のコマンドを実行します。
bash
perl -v
Perlがインストールされていれば、バージョン情報が表示されます。
This is perl 5, version ..., built for ...
...
もしインストールされていなければ、お使いのOSのパッケージマネージャーを使ってインストールしてください。
- Debian/Ubuntu:
sudo apt update && sudo apt install perl
- CentOS/RHEL/Fedora:
sudo yum install perl
(CentOS/RHEL 8以降はdnf
) - macOS (Homebrew):
brew install perl
- Windows: Strawberry PerlやActivePerlなどのディストリビューションをダウンロードしてインストールします。XAMPPなどにも含まれています。
多くのサーバー環境では、/usr/bin/perl
または /usr/local/bin/perl
にインストールされます。CGIスクリプトの最初の行に記述するPerlインタープリタのパスを確認しておきましょう。which perl
コマンドで確認できます。
bash
which perl
出力例: /usr/bin/perl
4.3 Apacheの設定
ApacheでPerl CGIを実行するには、主に以下の設定が必要です。設定ファイルは httpd.conf
という名前であることが多いですが、環境によって場所や分割方法が異なります(例: Ubuntuでは /etc/apache2/sites-available/
内の設定ファイルなど)。
a) ScriptAlias
ディレクティブ:
特定のディレクトリをCGIスクリプト専用のディレクトリとして指定します。このディレクトリ内のファイルは、サーバーが静的なファイルとしてではなく、実行可能なスクリプトとして扱います。慣習的に /cgi-bin/
というパスが使われます。
設定ファイルの例:
“`apache
cgi-bin ディレクトリをスクリプトエイリアスとして設定
ScriptAlias /cgi-bin/ “/path/to/your/cgi-bin/”
上記で設定したディレクトリに対して、実行権限を許可する
AllowOverride None
Options +ExecCGI
Order allow,deny
Allow from all
``
/path/to/your/cgi-bin/
*の部分は、実際にサーバー上にCGIスクリプトを配置するディレクトリの絶対パスに置き換えてください。例えば、
/var/www/cgi-bin/や
/usr/local/apache2/cgi-bin/などです。
Options +ExecCGI
*は、このディレクトリ内でのCGIスクリプトの実行を許可する設定です。
AllowOverride None
*や
Order/Allowはアクセス制御に関する設定ですが、ここではCGI実行に必要な
Options +ExecCGI` が重要です。
b) AddHandler
ディレクティブ (代替案):
特定のディレクトリではなく、特定の拡張子を持つファイルをCGIスクリプトとして扱いたい場合に AddHandler
を使います。例えば、どのディレクトリに置かれていても .cgi
や .pl
拡張子のファイルをCGIとして実行したい場合に使えます。(ただし、セキュリティのため、無制限に許可するのではなく、特定のディレクトリ内でのみ有効にするのが一般的です)。
設定ファイルの例 (例: /var/www/html/cgi-scripts/
ディレクトリ内でのみ .cgi
および .pl
をCGIとして扱う):
apache
<Directory "/var/www/html/cgi-scripts/">
Options +ExecCGI
AddHandler cgi-script .cgi .pl
AllowOverride None
Order allow,deny
Allow from all
</Directory>
この場合、ScriptAlias
は不要ですが、スクリプトを置くディレクトリに Options +ExecCGI
と AddHandler
の設定が必要です。初心者はまず ScriptAlias
を使った専用ディレクトリ方式で始めるのがシンプルでおすすめです。
設定変更の反映: Apacheの設定ファイルを変更した後は、設定を反映させるためにApacheを再起動またはリロードする必要があります。
- systemd を使っているシステム (多くの最近のLinux):
sudo systemctl restart apache2
またはsudo systemctl reload apache2
- sysvinit を使っているシステム (一部の古いLinux):
sudo service apache2 restart
またはsudo /etc/init.d/apache2 restart
- macOS (brew インストールの場合):
brew services restart apache2
4.4 CGIスクリプトのファイル権限設定
CGIスクリプトは、ウェブサーバーを実行しているユーザー(通常は apache
, www-data
, _www
など)によって実行されます。このユーザーがスクリプトファイルを読み込み、実行できる権限が必要です。
一般的な権限設定は 755
です。これは所有者(通常はスクリプトを作成したユーザー)に読み書き実行権限、グループとその他のユーザーに読み込みと実行権限を与えるものです。
ターミナルで、作成したCGIスクリプトファイルに対して以下のコマンドを実行します。
bash
chmod 755 /path/to/your/cgi-bin/your_script.cgi
もしファイル権限が正しく設定されていない場合、ブラウザからアクセスすると「403 Forbidden」(権限がない)エラーが表示されたり、サーバーのエラーログに「Permission denied」のようなメッセージが出力されたりします。
これで、Perl CGIスクリプトを実行するための基本的な環境設定は完了です。
第5章:あなたの最初のPerl CGIスクリプト (“Hello, World”)
さあ、実際にPerl CGIスクリプトを作成し、実行してみましょう。最初は最もシンプルな「Hello, World」スクリプトです。
5.1 スクリプトコードの作成
テキストエディタを開き、以下のコードを入力します。
“`perl
!/usr/bin/perl
— CGIスクリプトとして必須のヘッダー出力 —
Content-type: レスポンスのデータ形式を示す
text/html: HTML形式のテキストであることを示す
空行 (\n\n) がヘッダーの終わりを示す。これがないとCGIとして正しく認識されない!
print “Content-type: text/html\n\n”;
— ブラウザに表示する内容(HTML)の出力 —
ここから下はブラウザに表示したいHTMLを標準出力にprintする
print “<!DOCTYPE html>\n”;
print “\n”;
print “
print “\n”;
print “
print “\n”;
print “\n”;
print “
Hello, World from Perl CGI!
\n”;
print “
This is your first dynamic page.
\n”;
print “\n”;
print “\n”;
“`
5.2 コードの解説
#!/usr/bin/perl
: これは「シバン (Shebang)」または「インタプリタ指定行」と呼ばれる行です。このスクリプトをどのプログラムで実行するかをOSに指示します。/usr/bin/perl
はPerlインタープリタの一般的なパスですが、環境によって異なる場合があります(which perl
コマンドで確認したパスを使用してください)。この行は、スクリプトを直接実行可能にするために必要です。print "Content-type: text/html\n\n";
: これがCGIスクリプトとして最も重要な出力です。Content-type: text/html
は、サーバーに対して、このスクリプトの出力がHTML形式のテキストであることを伝えます。これにより、サーバーはレスポンスのHTTPヘッダーにContent-Type: text/html
を含めます。\n\n
(改行コード2つ) は、HTTPヘッダーの終わりを示す空行として機能します。 CGIの出力は、まずHTTPヘッダーを一行以上出力し、その後に必ず空行を一つ挟んで、ボディの内容(HTMLなど)を出力するというルールになっています。この空行がないと、サーバーはヘッダーとボディの区別ができず、500 Internal Server Error を返したり、スクリプトの出力がそのままテキストとして表示されたりします。
print "<!DOCTYPE html>...</html>\n";
: ここから下は、ブラウザに表示させたいHTMLの内容を標準出力(STDOUT)にひたすら出力しています。print
文で出力された内容は、前述のヘッダーと空行の後に、サーバー経由でブラウザに送られます。
5.3 ファイルの保存と配置
このコードを hello.cgi
または hello.pl
といった名前で保存します(拡張子はApacheの設定でCGIとして扱うように指定したものに合わせてください。ScriptAlias
ディレクティブで指定したディレクトリの場合は .cgi
や .pl
のどちらでも構いませんが、.cgi
がより一般的です)。
保存したファイルを、Apacheの設定でCGI実行が許可されているディレクトリ(例: ScriptAlias
で指定した /path/to/your/cgi-bin/
ディレクトリ)に配置します。
5.4 ファイル権限の設定
サーバーにログインし、配置した hello.cgi
ファイルに対して実行権限を付与します。
bash
chmod 755 /path/to/your/cgi-bin/hello.cgi
/path/to/your/cgi-bin/
は、実際にファイルを置いたディレクトリのパスに置き換えてください。
5.5 ブラウザからのアクセス
ウェブブラウザを開き、CGIスクリプトのURLにアクセスします。URLは、サーバーのドメイン名またはIPアドレスと、Apache設定で定義したエイリアスパス、ファイル名を組み合わせたものになります。
例: http://yourserver.com/cgi-bin/hello.cgi
正しく設定されていれば、ブラウザに以下のように表示されるはずです。
Hello, World from Perl CGI!
This is your first dynamic page.
おめでとうございます!これで、Perl CGIスクリプトをウェブサーバー上で実行し、動的なコンテンツを生成する最初のステップをクリアしました。
5.6 うまくいかない場合のチェックポイント
もしブラウザにエラーが表示されたり、期待通りに表示されなかったりした場合は、以下の点を確認してください。
- 500 Internal Server Error:
- Perlスクリプトのシンタックスエラー: スクリプトの中に文法エラーがないか確認してください。ターミナルで
perl -c /path/to/your/cgi-bin/hello.cgi
を実行すると、文法チェックができます。 - シバン行のパスが間違っている:
#!/usr/bin/perl
のパスが、実際のPerlインタープリタのパスと一致しているか確認してください(which perl
で確認)。 Content-type:
ヘッダーがない、または空行がない:print "Content-type: text/html\n\n";
の行が正しく記述されており、\n\n
が含まれているか確認してください。- サーバーのエラーログ: Apacheのエラーログ(通常は
/var/log/apache2/error.log
や/etc/httpd/logs/error_log
など)を確認してください。CGIスクリプトの実行時に発生したエラーメッセージが記録されているはずです。
- Perlスクリプトのシンタックスエラー: スクリプトの中に文法エラーがないか確認してください。ターミナルで
- 403 Forbidden:
- ファイル権限が不適切:
chmod 755 /path/to/your/cgi-bin/hello.cgi
が実行されているか確認してください。スクリプトの所有者、グループ、その他のユーザーに対する実行権限(x)が必要です。ディレクトリ自体にもサーバーがアクセスできる権限が必要です(通常は755や775)。 - Apacheの設定でCGI実行が許可されていない:
ScriptAlias
またはAddHandler
とOptions +ExecCGI
の設定が正しく行われているか確認してください。
- ファイル権限が不適切:
- スクリプトの中身がそのままテキストとして表示される:
- ApacheがCGIスクリプトとして認識していない:
ScriptAlias
のディレクトリに置かれているか、またはAddHandler
の設定で拡張子が認識されているか確認してください。 Content-type:
ヘッダーが出力されていない: 前述の500エラーの場合と同様、このヘッダーと空行が正しく出力されているか確認してください。
- ApacheがCGIスクリプトとして認識していない:
デバッグはウェブ開発において非常に重要なスキルです。特にCGIでは、サーバー側の設定とスクリプト自体の両方を疑う必要があります。
第6章:ブラウザからの入力(GET/POST)を処理する
動的なウェブアプリケーションの核心の一つは、ユーザーからの入力を受け取って、それに応じた処理や表示を行うことです。CGIでは、ブラウザから送信されたGETパラメータやPOSTデータといった入力を受け取ることができます。
入力データは、ウェブサーバーによってCGIスクリプトに渡されます。GETメソッドの場合は環境変数 QUERY_STRING
を通じて、POSTメソッドの場合は標準入力(STDIN)を通じて渡されるのが基本的な仕組みです。
これらの生のデータを直接解析することも可能ですが、非常に煩雑でエラーを起こしやすいため、Perlの標準モジュールである CGI.pm
を使うのが一般的です。CGI.pm
はこれらのデータの解析を自動で行ってくれるため、開発者はデータの利用に集中できます。
6.1 CGI.pm モジュールの基本
CGI.pm
はPerlの標準ディストリビューションに含まれているため、別途インストールする必要はほとんどありません。スクリプトの中で use CGI;
と記述するだけで使えます。
CGI.pm
を使うと、以下のような便利な機能が提供されます。
- GET/POSTパラメータの自動解析と取得
- HTTPヘッダー(Content-Typeなど)の簡単な出力
- HTMLタグを生成するための関数(これは賛否両論ありますが、簡単な出力には便利です)
- クッキーの処理など
6.2 GETパラメータの処理
GETメソッドでは、データはURLの末尾に ?
に続けて キー=値
の形式で渡されます。複数のパラメータがある場合は &
で区切ります。例えば、http://yourserver.com/cgi-bin/greet.cgi?name=Alice&age=30
のようになります。この name=Alice&age=30
の部分がクエリ文字列であり、CGIスクリプトには環境変数 QUERY_STRING
として渡されます。
CGI.pm
を使うと、このクエリ文字列の解析を意識する必要がありません。
サンプルコード:GETで渡された名前を表示する
greet_get.cgi
という名前で以下のスクリプトを作成します。
“`perl
!/usr/bin/perl
use strict;
use warnings;
use CGI; # CGIモジュールを使う
CGIオブジェクトを作成
my $cgi = CGI->new;
— ヘッダー出力 —
Content-typeヘッダーを出力
print $cgi->header; # CGI.pmを使うとheader()関数で簡単にヘッダーを出力できる
— パラメータの取得 —
‘name’というキーで渡されたパラメータの値を取得
パラメータが存在しない場合はundefが返る
my $name = $cgi->param(‘name’);
パラメータが渡されたかチェックし、表示内容を決定
my $greeting;
if (defined $name && $name ne ”) {
# 名前が渡された場合
$greeting = “Hello, ” . $cgi->escapeHTML($name) . “!”; # HTMLエスケープを忘れずに!
} else {
# 名前が渡されなかった場合
$greeting = “Hello, Guest!”;
}
— HTMLボディの出力 —
print $cgi->start_html(“Greeting Page”); # HTML開始タグ、タイトルを出力
print “
$greeting
“;
print “
Try adding ‘?name=YourName’ to the URL.
“;
print $cgi->end_html; # HTML終了タグを出力
“`
コードの解説:
use strict; use warnings;
: Perlのコーディング規約として強く推奨される行です。潜在的なエラーを早期に検出できます。use CGI;
: CGIモジュールをインポートします。my $cgi = CGI->new;
: CGIオブジェクトを作成します。このオブジェクトを通じて、パラメータの取得やHTMLの生成などを行います。print $cgi->header;
:CGI.pm
が提供するheader()
関数を使うと、Content-type: text/html\n\n
のような必要なヘッダーと空行を簡単に出力できます。他のContent-Typeを指定したい場合は引数を与えます。my $name = $cgi->param('name');
:param()
関数は、GETまたはPOSTで渡された指定したキーのパラメータの値を取得します。ここではname
というキーのパラメータを取得しています。if (defined $name && $name ne '')
:$name
変数に値が格納されたか(つまり、name
パラメータがURLに含まれていたか)をチェックしています。defined
は変数が定義されているか、ne ''
は空文字列ではないかを確認しています。$cgi->escapeHTML($name)
: セキュリティ上非常に重要です。 ユーザーから受け取ったデータ(ここでは$name
)をそのままHTMLに出力すると、クロスサイトスクリプティング(XSS)の脆弱性が生まれる可能性があります。escapeHTML()
関数は、HTMLの特殊文字(<
,>
,&
,"
,'
)を安全なエンティティ(<
,>
など)に変換してくれます。ユーザーからの入力は必ず適切な方法でサニタイズまたはエスケープしてから使用しましょう。$cgi->start_html(...)
,$cgi->end_html
:CGI.pm
にはHTMLタグを生成する関数が多数用意されています。start_html
は<!DOCTYPE html><html><head>...</head><body>
まで、end_html
は</body></html>
を出力します。print "<h1>$greeting</h1>";
: HTMLタグ生成関数を使うこともできますが、簡単なHTMLはPerlのprint
文で直接文字列として出力する方が分かりやすい場合も多いです。
このスクリプトを cgi-bin
ディレクトリに配置し、権限を 755
に設定します。
実行例:
http://yourserver.com/cgi-bin/greet_get.cgi
にアクセス: “Hello, Guest!” と表示されます。http://yourserver.com/cgi-bin/greet_get.cgi?name=Alice
にアクセス: “Hello, Alice!” と表示されます。http://yourserver.com/cgi-bin/greet_get.cgi?name=<script>alert('XSS')</script>
にアクセス:escapeHTML
関数のおかげで、<script>alert('XSS')</script>
がそのまま表示され、JavaScriptは実行されません(XSSを防ぐ)。
6.3 POSTデータの処理
POSTメソッドでは、データはHTTPリクエストのボディに含められて送信されます。これは主にHTMLの <form>
タグを使って行われます。フォームの method
属性を post
に設定し、action
属性にCGIスクリプトのURLを指定します。ユーザーがフォームを送信すると、ブラウザは入力データをまとめて指定されたURLにPOSTリクエストとして送信します。
CGIスクリプトでは、POSTデータは標準入力(STDIN)から読み込むことができます。これも手動で解析するのは大変なので、CGI.pm
を使うのが最も簡単です。CGI.pm::param()
関数は、GETでもPOSTでも同じようにパラメータを取得できます。
サンプルコード:POSTで送信されたフォームデータを処理する
まず、フォームを表示するためのHTMLファイル(または別のCGIスクリプト)が必要です。ここでは簡単なHTMLファイルと、それを受け取るPerl CGIスクリプトを作成します。
myform.html
(静的HTMLファイルとしてサーバーのドキュメントルートなどに配置)
“`html
Enter Your Name
``
*