CGI-BBS > チャット > 簡易チャット > minichatをvirtualaveで使う場合にも$hostを記録させたい


カレッヂ
カレッヂ


質問者 若秩父  投稿日 1/30(火) 09:40:10
virtualavenue(http://www.virtualave.net)という無料レンタルサーバがあるのですが、ここでminichatを使うと、参加者のホスト情報がログには<!--  -->としか記録されないようなのです。
理由は分かりませんが、いろんなスクリプトを参照しながら、あてずっぽうに以下の変更をしたら、IPアドレスを記録するようになりました。が、記録されたIPが、最新の発言者のIPですべて上書きされてしまうため、きちんとした機能を果たしていません。

-----------------------------

111行目if ($host eq $addr)...を以下に変更

        if ($get_remotehost) {
                if ($host eq "" || $host eq "$addr") {
                        $host = gethostbyaddr(pack("C4",split(/\./,$addr)),2);
                }
        }
        if ($host eq "") { $host = $addr; }

        if ($host =~ /(.*)\.(\d+)$/) { ; }
        elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; }
        elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; }

-----------------------------

そこでお聞きしたいのですが、この方法は適切だったのでしょうか?
また、変更箇所に無駄な部分があるようでしたら教えてください。
「結果オーライ」でもいいのですが、せっかくの機会なので知っておきたいと思いまして。
はっきり申しまして、これがどのような働きをしているのか、全然わかっておりません。

よろしくおねがいします。
回答者 しあわせのツボ  [削除]  投稿日 1/30(火) 11:52:33
バージョンはどれですか?
IPとおっしゃってますが、記録したいのはIPアドレス(192.168.0.2)ですか、それともホスト名(www.rescue.ne.jp)ですか?
111行目というのは未改造の状態でですか? 物理行(画面上の行数)でなく論理行(改行から改行までが1行)で数えてますか?
5.2と6.0nでは該当箇所が見当たらないのですが。

5.2を物理行で数え、IPを記録したいのだと仮定します。
論理行105-108
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }

if ($max <= $#lines +1) { shift(@lines); }
push(@lines,"$date_now\t$FORM{'name'}\t$FORM{'chat'}\t$FORM{'email'}\t$host\n");

if ($host eq "") { $host = $addr; }
if ($host eq $addr) { $host = gethostbyaddr(pack('C4',split(/\./,$host)),2) || $addr; }
if ($addr =~ /^123\.11\.23/ ) { $ip_color='<font color="#ff00ee">'; }
elsif ($addr =~ /^192\.25\.200/) { $ip_color='<font color="#88eeff">'; }
else { $ip_color = '<font color="#000000">'; }
while ($max <= $#lines +1) { shift(@lines); }
push(@lines,"$date_now\t$ip_color$FORM{'name'}</font>\t$FORM{'chat'}\t$FORM{'email'}\t$addr\n");
としてみて下さい。
line 147
else { print "$name &gt; $chat ($date) <!-- $host -->\n"; }
の$hostは$addrにせずそのままです。
質問者 若秩父  [削除]  投稿日 1/30(火) 12:48:41
ありがとうございます。お手間とらせてしまいすみません。
使っているのは「簡易チャット version 5.2」、それとご指摘の通り「111行目」ではなく「105行目」でした。111行目(本当は105行目)は、1行まるまる削除して上記のコードをそこに入れました、が、紛らわしいので捨てます。

記録したいのは、本来ならホスト名の方がベターなのですが、このサイト(virtualavenue)ではホスト名の参照は出来ないようにしている旨の話を聞いたことがあります(具体的にそれがどういうことかは私には分かりませんが)ので、IPアドレスでも構いません。

早速試してみたいのですが、帰宅してからでないとサーバのパスワードなどが不明なので、今夜以降あらためて結果を報告させていただきます。
質問者 若秩父  [削除]  投稿日 1/31(水) 08:47:56
やってみました。

結果から申しますと、ハンドル名の文字色はそのままで、なおかつ発言が無茶苦茶になってしまいました。
例えば「若秩父」で参加したユーザーが「テスト」と発言した場合、

<hr>
テストです &gt;  () <!--  -->
<hr>
<b>若秩父
</b> &gt;  (06時55分) <!--  -->
<hr>

となってしまいます。
ログを見ると、IPアドレスも記録されておりません。

確認させて欲しいのですが、105行目から108行目までを上記の通りに書き換えればよろしいのですね?
また、他の行はなにもしないでよろしいのですね?

一応、間違いはないと思うのですが...
ちなみに今回も「簡易チャット5.2」です。
回答者  [削除]  投稿日 1/31(水) 10:56:51
>確認させて欲しいのですが、105行目から108行目までを上記の通りに書き換えればよろしいのですね?
>また、他の行はなにもしないでよろしいのですね?

そうとは限りません。
サーバによってCGIの動作環境が違うので
「こうすれば必ずうまくいく」という方法があるとは限りません。


以下のようなスクリプトを実行してIPアドレスが表示されなければ
IPアドレスの取得自体が不可能です。
(そんな仕様のサーバは聞いたことないですが)


#!/usr/local/bin/perl

print "Content-type: text/html\n\n";
print "<html<head><title>環境変数一覧</title></head><body>\n";

foreach (sort keys %ENV){
    print "$_: $ENV{$_}<br>\n";
}

print "</body></html>\n";
exit;
回答者 しあわせのツボ  [削除]  投稿日 1/31(水) 11:07:27
おそらく、文字列なのか変数名の一部なのかをPerlが理解できていないのでしょう。
上記のうち
push(@lines,"$date_now\t$ip_color$FORM{'name'}</font>\t$FORM{'chat'}\t$FORM{'email'}\t$addr\n");

push(@lines,"$date_now\t$ip_color" . $FORM{'name'} . '</font>' . "\t$FORM{'chat'}\t$FORM{'email'}\t$addr\n");
としてみて下さい。
質問者 若秩父  [削除]  投稿日 1/31(水) 11:11:38
試しました。
* は私が伏せました)

DOCUMENT_ROOT: /data1/virtualave.net/******
GATEWAY_INTERFACE: CGI/1.1
HTTP_ACCEPT: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, image/png, */*
HTTP_ACCEPT_CHARSET: iso-8859-1, *, utf-8
HTTP_ACCEPT_ENCODING: gzip
HTTP_ACCEPT_LANGUAGE: en-US, ja, pdf
HTTP_CLIENT_IP: ***.***.**.**
HTTP_CONNECTION: Keep-Alive
HTTP_COOKIE: p_go2id=Nigp2Z1TjEYvPWH86yvoYA
HTTP_HOST: ****.virtualave.net
HTTP_REFERER: http://*****.virtualave.net/test/
HTTP_USER_AGENT: Mozilla/4.76 (Macintosh; U; PPC)
HTTP_VIA: HTTP/1.1 proxy01[D28BFCA4] (Traffic-Server/3.0.6 [uSc s f p eN:tUc i p s ])
HTTP_X_FORWARDED_FOR: ***.***.**.**
PATH: /usr/local/bin:/usr/bin:/bin
QUERY_STRING:
REMOTE_ADDR: ***.***.***.***
REMOTE_PORT: 62828
REQUEST_METHOD: GET
REQUEST_URI: /test/test.cgi
SCRIPT_FILENAME: /data1/va/*****/test/test.cgi
SCRIPT_NAME: /test/test.cgi
SCRIPT_URI: http://*****.virtualave.net/test/test.cgi
SCRIPT_URL: /test/test.cgi
SERVER_ADMIN: webmaster@virtualave.net
SERVER_NAME: *****.virtualave.net
SERVER_PORT: 80
SERVER_PROTOCOL: HTTP/1.0
SERVER_SOFTWARE: Apache/1.3.6 (Unix) g2am/1.44 adutil/1.8 g2ad/1.70

以上です。
如何でしょうか?
質問者 若秩父  [削除]  投稿日 1/31(水) 11:19:22
しあわせのツボさんの通りにしてみました。
書き込みも普通に行え、IPアドレスも記録されてます。

例の「ハンドルの色を変える」も込みで再度試してみたいと思います。
もう少々お時間をください。
回答者  [削除]  投稿日 1/31(水) 11:34:20
いまいち現状がつかめていないので
改造したソースをどこかで公開していただけると
回答がしやすいです。
(公開できないのなら別にいいです)
質問者 若秩父  [削除]  投稿日 1/31(水) 12:27:28
私もソースを見ていただいた方が早いかなとも思ったのですが、匿名性(と言ったらいいのでしょうか)が保証されるようなそういう場所を知らないのでためらっていました。

とりあえず今夜、上記の方法を試してみて、また検討してみます。
質問者 若秩父  [削除]  投稿日 2/1(木) 08:54:59
万事うまく行きました。
基本的には、しあわせのツボさんの1/30(火)11:52:33および1/31(水)11:07:27を参考にしました。IPの記録もハンドルの色替えも、大丈夫です。
貴重なアドバイスを戴いたまささん、羊さん、しあわせのツボさん、本当にありがとうございました。

最後にもうひとつ、もしよろしければ教えてくれませんでしょうか?

しあわせのツボさんの1/31(水)11:07:27 で書かれた変更点は、どのような意味があるのでしょうか?
また、今回の改造はvirtualavenue以外でも通用するのでしょうか?逆に他のサーバではダメだとしたら今後注意しておきたいのですが...
回答者 まさ  [削除]  投稿日 2/1(木) 11:12:39
これはあくまでも小規模なチャットと言うことでそうしました。
つまり同じプロバイダーを使っている人はいないというのが私の中での前提です。

これが大規模なものになるとIPアドレスの最初の3つのブロックだけでは、何人も
重なる人が出てきます。つまり、個人を特定できません。

この方法はあまり規模の大きなものには適用できません。

規模が小さければ、チャットだけではなく、BBS等にも使用可能です。
回答者 しあわせのツボ  [削除]  投稿日 2/1(木) 11:31:28
後の変更点についてですが、書き方が違うだけです。
ただ、「この変数とこの文字列」というように明示することで、文字列を変数だと誤認すること(あるいはその逆)を防ぐ意味で変更しました。
質問者 若秩父  [削除]  投稿日 2/1(木) 11:32:50
ということは、懸念されているのは、同じプロバイダーの件についてだけであり、スクリプトそのものは他のサーバに転用してもまず問題はないってことと考えてよろしいのですね?
了解しました。そのことを承知した上で使わせて貰います。本当にありがとうございました。
質問者 若秩父  [削除]  投稿日 2/1(木) 11:35:04
(チャット状態ですね(笑))
しあわせのツボさんの件は、「より確実な記述」という考え方でよろしいのですね?
了解しました。
でも、「勉強になった」というほど改造した場所のコマンドを理解してません(^^; が、良い体験でした
回答者 まさ  [削除]  投稿日 2/1(木) 17:09:55
ずいぶん他サーバーへの転用を強調されてますけど、基本的にはIPアドレスを取ってこれる
サーバーならどこでも構いません。IPアドレスを取ってこれないサーバーなんてあるのかな?
ホスト名ならDNSがなければわかりませんが、IPアドレスならどんなサーバーでも取得可能
だと思いますんで、基本的にはどんなサーバーでも動きます。あまりナーバスにならなくても
いいと思いますよ。
質問者 若秩父  [削除]  投稿日 2/1(木) 17:28:20
ありがとうございます。
別にこのスクリプトを誰かに売りつけるとかは考えてませんが、無知だとどうしてもナーバスになってしまいますね(^^;

返信(回答)する


Web裏技