![]()
Shell(sh,csh)とPerl(version 4とversion 5)です。コマンドのパスは次の通りです。
sh → /usr/bin/sh
csh → /usr/bin/csh
Perl version 4.036 → /usr/local/bin/perl
Perl5 version 5.003 → /usr/local/bin/perl5
Perl56 version 5.6.0 → /usr/local/bin/perl56
CGIプログラムの1行目に#!の後に上記のパスを半角で記述します。
perlと記述しますと、Perl version 4になります。U-netSURFのPerl version 4ではflockが使用できないので、Perl5またはPerl56を使用してください。
CGIプログラムの拡張子は「.cgi」としてください。また、CGIプログラムの属性(パーミッション)に実行可能モードを追加してください。
注)jperl(日本語Perl)はインストールされておりません。
jcode.pl、cgi-bin.plはインストール済みですので、アップロードされる必要はありませんが、最新バージョンなどをホームディレクトリ以下にアップロードされても構いません。
Perl、Perl5 → jcode.pl version 2.3、cgi-lib.pl version 1.8l
Perl56 → jcode.pl version 2.13、cgi-lib.pl version 2.18
ホームディレクトリ以下にアップロードされた時は、require文でそのパスを指定するか、use lib文でそのパスを追加してください(@INCの先頭に追加されます)
なお、属性(パーミッション)に実行可能モードを追加する必要はありません。
例: require './lib/cgi-lib.pl'; # './lib'は、 現在のディレクトリ下にあるlibというディレクトリ。または use lib './lib'; require 'cgi-lib.pl';
CGI.pmは、Perl5ではインストールされていませんでしたので、アップロードして戴かなければなりませんでした。
Perl56では、インストールされていますので、アップロードされる必要はありません。
Perl → pm(パールモジュール)は、Perl version 4では利用できません。
Perl5 → CGI.pmはインストールされていません。
Perl56 → CGI.pm version 2.56
ホームディレクトリ以下にアップロードされた時は、use lib文でそのパスを追加してください(@INCの先頭に追加されます)。なお、属性(パーミッション)に実行可能モードを追加する必要はありません。
例:use lib './lib';
use CGI;
sendmail、nkfのパスは次の通りです。
sendmail → /usr/lib/sendmail
nkf → /usr/local/bin/nkf
CGIプログラムの設置場所は、任意です。
ただし、ホームディレクトリの直下には、cgi-binというディレクトリを作成 しないでください。
cgi-bin という名前でディレクトリを作成して、そのディレクトリ下に CGIプログラムを格納されても正しく起動されません。
cgi-binというディレクトリの意味ですが、アクセスカウンタの設置例で説明しますと <IMG SRC="/cgi-bin/Count.cgi?dd=A&df=Wnamae.dat">で呼び出すcgi-binディレクトリは、お客様のホームディレクトリ下にあるcgi-binディレクトリではなく、サーバ本来の(ルートの)cgi-bin ディレクトリにあるCount.cgiプログラムを呼んでいるということです。
ホームディレクトリ直下ではなく、あるディレクトリを作られてその下に cgi-binというディレクトリを作られるのは構いません。 例えば、./board/cgi-bin/board.cgiは正しく起動されます。 掲示板のCGIプログラムを使う場合、お客様のディレクトリ名がWnamae、 CGIプログラム名が board.cgi、データファイル名が board.dat でしたら以下のような階層になると思います。
Wnamae ---(ホームディレクトリ)
|- index.html
|- board(掲示板用ディレクトリ)
|- board.cgi
|- data(データファイルのディレクトリ)
|- board.dat
サーバ側では大文字、小文字を区別して別の文字とみなしますので、ディレクトリ名、ファイル名を指定する際は、注意してください。
CGIプログラムの属性(パーミッション)は、FTPソフトで実行可能(x)モードを追加してください。(664から775にしてください)
7:「オーナ」のパーミッションです。
7:「グループ」のパーミッションです。
5:「その他」のパーミッションです。4bi : r 読み取り可
2bit: w 書き込み可
1bit: x 実行可
通常は、775にしますが、U-netSURFでは、CGIプログラムは「その他」のアクセス権で実行されますので、次のように設定するのがベストです。
「オーナ」のパーミッションは、アップロードのために、6または7でなければいけません。 「グループ」のパーミッションは、ftpアカウントが複数あるときのアップロードのために、6または7でなければいけません。
上記の掲示板の例で、boardディレクトリ下にあるboard.cgiを呼び出すとき
フォームから入力したデータを、漢字コード変換等を行ってからメールする場合の サンプルは以下のとおりです。
注)CGIプログラムは、アップロード時のコードがShift_JISの場合とEUCの場合の2パターンあります。
<HTML>
<HEAD>
<META HTTP-EQUIV="content-type" CONTENT="text/html; charset=Shift_JIS">
<TITLE>電子メールの送信</TITLE>
</HEAD>
<BODY BGCOLOR="white" LINK=blue VLINK=blue>
<CENTER>
<FONT SIZE=4 COLOR=GREEN><B> 電子メールの送信 </B></FONT>
<FONT SIZE=3 COLOR=black>
<FORM ACTION="./send.cgi" METHOD="POST">
<B>メールアドレス</B>
<BR>
<INPUT TYPE="text" NAME="email" SIZE="30" MAXLENGTH="100">
<P> <B>お名前</B>
<BR>
<INPUT TYPE="text" NAME="name" SIZE="20" MAXLENGTH="50">
<P> <B>メッセージ</B>
<BR>
<TEXTAREA NAME="message" ROWS="3" COLS="50"></TEXTAREA> <P>
<INPUT TYPE="submit" VALUE="送信"> <INPUT TYPE="reset" VALUE="取消"> </FORM>
<B>全項目の入力を確認して“送信”ボタンをクリック下さい。</B>
<BR>
</CENTER>
</BODY>
</HTML>
パソコンからの入力データのコードは、Shift_JISですから、jcode.plのconvertでコード変換 する必要はありません。 下記の$mailto = 'ユーザID@dp.u-netsurf.ne.jp'; は御自身のメールアドレスに変更ください。 ヒアドキュメント内のFrom:のメールアドレスも変更してください。
ヒアドキュメント内の文字列またはダブルクォート内の文字列に、@があるときは、配列名でない ことを示すために、\@とエスケープしてください。
#!/usr/local/bin/perl56
print "Content-type: text/html; charset=EUC-JP\n\n";
require 'cgi-lib.pl';
require 'jcode.pl';
$nkf = "/usr/local/bin/nkf -j"; # nkfで JISコードへ変換。
#データの取出し
&ReadParse(*data);
$email = $data{'email'};
$name = $data{'name'};
$message = $data{'message'}; &jcode'convert(*name,'euc');??? #
EUCコードに変換。
&jcode'convert(*message,'euc'); # EUCコードに変換。
#メールの送信
$sendmail = "/usr/lib/sendmail";
$mailto = 'ユーザID@dp.u-netsurf.ne.jp';#ダブルクォートならば、"..\@dp.."となります。
open(MAIL,"| $nkf | $sendmail -t"); # -tは、To:で指定したところに送信。
print MAIL <<"_EOF_";
From: ユーザID\@dp.u-netsurf.ne.jp
To:$mailto
Subject:メール送信
メールアドレス: $email
お名前: $name
メッセージ: $message
_EOF_
close (MAIL);
print <<"REPLY";
<HTML>
<HEAD>
<TITLE>メール送信</TITLE>
</HEAD>
<BODY>
ありがとう!
<BR><BR>
メールアドレス: $email<BR>
お名前: $name<BR>
メッセージ: $message<BR>
</BODY>
</HTML>
REPLY exit;
注)コードのコードのコピー&ペーストで左側に空白文字が入ったとき、削除してください。 1行目 #!/usr/local/bin/perl5 は「#!」で書き始めます。 ヒアドキュメントの終端文字列 _EOF_ の前後に空白文字を置かないようにしてください。
cgi-lib.plパッケージは、CGIプログラムをPerlで記述した場合に使用します。 GETやPOST形式に対応、入力データを連想配列に入れ込みます。
データの漢字コード変換について
jcode.plパッケージは、CGIプログラムをPerlで記述した場合に使用します。認識できる漢字コード系は、JIS コード(jis)、MS 漢字コード(sjis)、および日本語EUC(euc)の3種類です。
EUCに変換 &jcode'convert(*NAME、'euc');
JISに変換 &jcode'convert(*NAME、'jis');
SJISに変換 &jcode'convert(*NAME、'sjis');
ファイルの漢字コードをJISコードに変換し、sendmailに渡します。nkfが認識できる入出力の漢字コード系は、JIS コード(jis)、MS 漢字コード(sjis)、および日本語EUC (euc) の3種類です。
EUC に変換 /usr/local/bin/nkf -e 入力ファイル > 出力ファイル?
JIS に変換 /usr/local/bin/nkf -j 入力ファイル > 出力ファイル
SJIS に変換 /usr/local/bin/nkf -s 入力ファイル > 出力ファイル
注)入力ファイル内に半角カナコードを使用しないでください。
sendmailへのオプション -tで To:で指定したところに送信します。
From:がないときは(Fromの省略時値は)、www@Webサーバ名になります。
例:ホームページのディレクトリ構造と各ファイルが以下の場合
Wnamae (ホームディレクトリ)
|--send.html
|--send.cgi [パーミッション 775]
FTPソフトを使ってパソコンからサーバへファイルをアップロードします。
メッセージのところに <FONT SIZE="6">FONTサイズ6</FONT> と入れて 送信してみてください。文字が大きく表示されます。
太字、 罫線、<META> (強制的に別ページへ飛ばす)などのタグ、それと、タグ閉じ忘れも試してみてください。
このように、タグ付きの入力データをそのままhtmlに組み込むと、ブラウザで処理されてしまい、入力データの再表示という単純な目的が果たせません。
メッセージ欄において、すべてのタグを禁止するには、以下の文をデータ取り出し文の次に入れてください。
$message = $data{'message'};
$message =~ s/</</g; #<<< 追加。タグ禁止。
"<"の文字を"<"に置き換えたのをブラウザが受け取りますが、ブラウザは"<"を"<"に変換しますので、入力されたデータが そのまま表示されることになります。
このテキストに記述しているサンプルは、CGIを理解していただくためのものです。 公開されるCGIには、必ず、いたずら防止などのチェック機能を組み込んでください。 タグの禁止、許可するタグの処理などについての詳細は、CGI書籍等を参照してください。