リモートホストなどの表示をソースに
[上に]
[前に]
[次に]
牛あたま
2000/02/13(日) 02:37:51
シンプルなBBSを設置したいと思っていますが、リモートホスト
やIPアドレス、機種のバージョンも取りたいです。
画面上はあくまでシンプルにしたいので、以上の情報を
ソース表示されるようにしたい場合、スクリプトにどのような
追加記述をすればよいでしょうか?
EMI
2000/02/13(日) 02:53:52
ソースに表示するんなら、一例としてはこんな感じ。
print "<!-- $ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'} $ENV{'HTTP_USER_AGENT'} -->";
Ichi
2000/02/13(日) 06:49:14
>print "<!-- $ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'} $ENV{'HTTP_USER_AGENT'} -->"
これだけだとHTTP_USER_AGENTに'--'を入れられるとコメント後の文字が
全てコメントになってまずいです。(厳密な解釈の場合)
$_ = $ENV{'HTTP_USER_AGENT'};
s /--/−/g; # とりあえず全角で逃げる
print "<!-- $ENV{'REMOTE_HOST'} $ENV{'REMOTE_ADDR'} $_ -->"
でしょうか。
牛あたま
2000/02/14(月) 03:43:38
EMIさまIchiさま、どうもありがとうございました!(感謝)
ところで、こんな事聞いて申し訳ないのですが、教えて
頂いた文はスクリプトの切れのよさそうなとこへペースト
して大丈夫でしょうか。どの辺りに書かなくてはいけないとか
わからないもので・・。(スミマセン)
猫
2000/02/14(月) 04:03:13
>頂いた文はスクリプトの切れのよさそうなとこへペーストして大丈夫でしょうか。
どの様なスクリプトを使っているのか知りませんが,投稿した人の環境変数を表示するには,書きこみ時に環境変数をファイルに記録しなければなりません.
そうしないと,閲覧している人の環境が表示されるだけです.
つまり,環境変数を取得し,ファイルに書きこみ,読み出し表示する,という処理をしなくてはならないわけです.
簡単な事ですが,そこらにペーストすればす済むいうものではありません.
というわけで,大丈夫ではないとおもいます.
牛あたま
2000/02/15(火) 13:29:53
猫さまご助言ありがとうございます!(感謝)
そしてすみませんでした。cgiについて余りに無知すぎたようです。^_^;
しかしスクリプトを見て見ましたが、環境変数の取得??など
意味を理解出来ないでいます。(かなり勉強して精進しなければ…)
心苦しいんですが、どなたか解る方いたらアドバイスいただけないで
しょうか。設置希望しているスクリプトです↓
#!/usr/bin/perl -b
require 'jcode.pl'; #漢字変換ライブラリを読み込む
$title = 'board'; #掲示板タイトル
$logfile = 'bbs.log'; #ログファイル
$maxlog = 10; #ログの最大保存数
$hold_days = 365; #クッキー保存日数
$cookie_id = 'bbs'; #クッキーの識別名
$now = time; #現在の時刻
$self = $ENV{'SCRIPT_NAME'}; #このスクリプトの名前
### クッキーの取得
&get_cookie(); #クッキー取得
$name = $cookie{'name'}; #名前欄をクッキーで初期化
$addr = $cookie{'addr'}; #アドレスをクッキーで初期化
### フォーム入力パラメータの取得
$datasize = $ENV{'CONTENT_LENGTH'}; #フォーム入力データのバイト数
if ($datasize > 0) {
read(STDIN, $alldata, $datasize);
foreach $data (split(/&/, $alldata)) { #フォーム入力パラメータの取得
($key, $val) = split(/=/, $data); #パラメータ名と値に分割
$val =~ tr/+/ /; #URLエンコードの復元
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$val =~ s/\t//g; #タブコードを削除
&jcode'convert(*val, "sjis"); #漢字を統一
$param{$key} = $val;
}
$name = &the_name($param{'name'}); #名前の正規化
$addr = &the_addr($param{'addr'}); #アドレスの正規化
$text = &the_text($param{'text'}); #本文の正規化
}
### クッキーの再設定
$cookie{'name'} = $name;
$cookie{'addr'} = $addr;
&set_cookie(); #クッキーを保存
### 入力欄にデータがない場合をチェック
if ($datasize > 0) { #フォーム入力がある場合で
if ($name eq '') { #名前がなければ
&error('名前は省略できません'); #エラーにする
exit;
}
if ($text eq '') { #本文がなければ
$datasize = 0; #データなしとみなす
} #(この場合は再表示のみ行う)
}
### ログの読み書き
unless (open(FILE, "+<$logfile")) { #ログファイルをオープン
&error("ログファイルをオープンできません");
exit;
}
flock(FILE, 2); #ファイルをロック
@logs = <FILE>; #全データ読み込み
if ($datasize > 0) { #フォーム入力があれば
$line = "$now\t$name\t$addr\t$text\n"; #新しい行を作る
unshift(@logs, $line); #ログの先頭に挿入する
while ($#logs >= $maxlog) { #$maxlog以下になるまで
pop(@logs); #古いデータを削除する
}
seek(FILE, 0, 0); #ファイルポインタを先頭に戻す
print FILE @logs; #全体をファイルに書き込む
truncate(FILE, tell); #余分なデータを切りつめる
}
flock(FILE, 8); #ロック解除
close(FILE); #クローズ
### HTML文書の出力:ヘッダからフォームの部分まで
$name = ¬ag($name);
$addr = ¬ag($addr);
print <<"END";
Content-type: text/html
<html>
<head>
<title>$title</title>
</head>
<body>
<BODY bgcolor="#FFCCCC" text="#999900" link="#3399CC" alink="#996600" vlink="#CC0033">
<h1>$title</h1>
<form method="POST" action="$self">
<table border="0" cellspacing="2" cellpadding="0">
<tr>
<td nowrap align="right">お名前 </td>
<td nowrap><input type="text" name="name" size="40" value="$name"></td>
</tr>
<tr>
<td nowrap align="right">アドレス </td>
<td nowrap><input type="text" name="addr" size="48" value="$addr"></td>
</tr>
<tr>
<td nowrap align="right" valign="top"><br>本文 </td>
<td nowrap><textarea name="text" rows="8" cols="72" wrap="soft"></textarea></td>
</tr>
<tr><td height="6"></td></tr>
<tr>
<td></td>
<td><input type="submit" value="書き込み(本文なしなら再読込)">
<input type="reset" value="りせっと"></td>
</tr>
</table>
</form>
<small>$maxlog個までのメッセージを保存します。
それを超えると古いメッセージから削除します。</small>
END
### HTML文書の出力:書き込まれたメッセージを新しい順に
foreach $line (@logs) {
chop($line);
($date, $name, $addr, $text) = split(/\t/, $line);
$date = &make_date($date);
$name = &make_link($name, $addr);
$text = &make_text($text);
print "<hr><b>$name</b> $date<br>\n"; #名前と日付
print "<font size=\"1\"> </font><br>\n"; #小さく改行
print "$text\n"; #本文出力
}
### HTML文書の出力:最後のフッタ部分
print <<"END";
<hr>
<div align="right">管理人 : <i><a href="mailto:$mail">$mail</a></i></div>
<br>
</body>
</html>
END
exit;
### 以下はユーザー定義関数
sub notag { #HTMLタグを無効にする
local($x) = @_;
$x =~ s/&/&/g;
$x =~ s/"/"/g;
$x =~ s/</</g;
$x =~ s/>/>/g;
return $x;
}
sub the_name { #入力された名前を正規化
local($name) = @_;
$name =~ s/^\s+//; #先頭のスペースを削除
$name =~ s/\s+$//; #末尾のスペースを削除
return $name;
}
sub the_addr { #入力されたアドレスを正規化
local($addr) = @_;
$addr =~ s/^\s+//; #先頭のスペースを削除
$addr =~ s/\s+$//; #末尾のスペースを削除
return $addr;
}
sub the_text { #入力されたテキストを正規化
local($text) = @_;
$text =~ s/\r?\n/\r/g; #改行コードをすべて"\r"に変換
$text =~ s/^\r+//; #先頭の空行を削除
$text =~ s/\r+$//; #末尾の空行を削除
return $text;
}
sub make_date { #表示用の日時データを作成
local($t) = @_;
($sec, $min, $hour, $day, $mon, $year, $wday) = localtime($t);
@wdays = ("日", "月", "火", "水", "木", "金", "土");
return sprintf("%d年%d月%d日(%s) %02d時%02d分",
$year+1900, $mon+1, $day, $wdays[$wday], $hour, $min);
}
sub make_link { #表示用の名前リンクを作成
local($name, $addr) = @_;
$name = ¬ag($name); #HTMLタグ禁止
$addr = ¬ag($addr); #HTMLタグ禁止
if ($addr eq '') { #アドレスがなければ
return $name; #名前だけを返す
}
else { #アドレスがあれば
unless ($addr =~ /^http:|^mailto:/) { #先頭にhttp:もmailto:もなければ
$addr = "mailto:$addr"; #mailto:を付加する
}
return "<a href=\"$addr\">$name</a>"; #リンクを作って返す
}
}
sub make_text { #表示用の本文データを作成
local($text) = @_;
$text = ¬ag($text); #HTMLタグ禁止
$text =~ s/\r/<br>\n/g; #改行コードを<BR>タグに
return $text;
}
sub error { #エラー出力
local($mesg) = @_;
print "Content-type: text/html\n\n";
print "<html><head><title>$title</title></head>\n";
print "<body><h2>$title エラーメッセージ</h2>\n";
print "<p>$mesg</p><a href=\"$self\">$title に戻る</a>\n";
print "</body></html>\n";
}
### 以下クッキー関連の関数定義
sub get_cookie {
foreach $pair (split(/; /, $ENV{'HTTP_COOKIE'})) {
($key, $val) = split(/=/, $pair);
$all_cookies{$key} = $val;
}
foreach $pair (split(/&/, $all_cookies{$cookie_id})) {
($key, $val) = split(/:/, $pair);
$key = &unescape($key);
$val = &unescape($val);
$cookie{$key} = $val;
}
}
sub set_cookie {
@pairs = ();
foreach $key (sort(keys(%cookie))) {
$val = $cookie{$key};
push(@pairs, &escape($key).":".&escape($val));
}
$new_cookie = join('&', @pairs);
$date = &gmt_date(time + $hold_days * 60 * 60 * 24);
if ($new_cookie ne $all_cookies{$cookie_id}) {
print "Set-Cookie: $cookie_id=$new_cookie; expires=$date\n";
}
}
sub escape {
local($x) = @_;
$x =~ s/([&:;=%\x00-\x21])/sprintf("%%%02X",unpack("C",$1))/ge;
return $x;
}
sub unescape {
local($x) = @_;
$x =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/ge;
return $x;
}
sub gmt_date {
local($t) = @_;
@wdays = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
@month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
($sec, $min, $hour, $day, $mon, $year, $wday) = gmtime($t);
return sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT",
$wdays[$wday], $day, $month[$mon], $year+1900, $hour, $min, $sec);
}
猫
2000/02/16(水) 04:35:50
コメントを目印にして置き換えて見てください.
$line = "$now\t$name\t$addr\t$text\t$ENV{'REMOTE_HOST'}\t$ENV{'REMOTE_ADDR'}\t$ENV{'HTTP_USER_AGENT'}\n"; #新しい行を作る
### HTML文書の出力:書き込まれたメッセージを新しい順に
〜のちょっと下の方
($date, $name, $addr, $text,$host,$ip,$agent) = split(/\t/, $line);
:
:
print "$text\n"; #本文出力
print "<!-- $host $ip $agent -->\n";
牛あたま
2000/02/17(木) 01:22:05
[[解決]]
猫さま!!お忙しい中、こんな面倒なお願いを聞いて
くださって本当にありがとうございました!!!
そして、教えていただいた通りに書き換えたら、ソース表示
出来るようになりました。(感動)
これからは、もっとスクリプトのこと色々読んで勉強しようと思います。
皆様今回は大変お世話になりました。m(_ _)m
[上に]
[前に]
[次に]