リモートホストなどの表示をソースに

[上に] [前に] [次に]
牛あたま 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 = &notag($name);
$addr = &notag($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/&/&amp;/g;
  $x =~ s/"/&quot;/g;
  $x =~ s/</&lt;/g;
  $x =~ s/>/&gt;/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 = &notag($name); #HTMLタグ禁止
  $addr = &notag($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 = &notag($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

[上に] [前に] [次に]