socket使用時の環境変数(REMOTE_ADDR)について

このQ&Aのポイント
  • socket使用時の環境変数(REMOTE_ADDR)について調査しましたが、正確な情報が得られませんでした。
  • AプログラムからBプログラムを呼び出した際に、AとBで取得されるREMOTE_ADDRが異なることがわかりました。
  • 対象のBプログラムでもAのREMOTE_ADDRを取得する方法については見つかりませんでした。
回答を見る
  • ベストアンサー

socket使用時の環境変数(REMOTE_ADDR)について

色々調べても結局わかりませんでしたので もしお分かりになる方がいらっしゃれば 教えて頂ければ幸いです。 socketを使用するAというプログラムを作ったのですが、 そのプログラムからBというプログラムを呼び出した時、 Aに取得されるREMOTE_ADDRは、私のREMOTE_ADDRになるのですが、 Bに取得されるREMOTE_ADDRは、サーバのREMOTE_ADDRになってしまいます。 Bに対しても私のREMOTE_ADDRを取得させたいのですが、 方法はありますでしょうか? 具体的なSOCKET使用機構は以下のようになっております。 use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)', Proto => 'tcp'); select($socket); $|= 1; select (STDOUT); print $socket "POST $path HTTP/1.0",CRLF,CRLF; close($socket); どうぞ宜しくお願い致します。

  • ubsk
  • お礼率66% (2/3)
  • Perl
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

AとBは別々のサーバー上にあるんですよね? となると、Aを呼び出しているのは貴方なわけですから AがあるサーバーではREMOTE_ADDRは貴方のREMOTE_ADDRになって当然です。 同じように、Bから見ればアクセスしてきてるのはAなわけですからAがあるサーバーのREMOTE_ADDRになって当然です。 もし、AとBが同一サーバー上にあったとしても、AがBにアクセス(サーバーが自分自身にアクセス)しているので同じことになります。 つまり、IP spoofingでもしない限りはムリということになると思います。

ubsk
質問者

お礼

あぁ~なるほど!! 言われてみればそうですね。 実行しているのは私なのですから、Bに対しても REMOTE_ADDRは私のものが渡されるものと思いこんで いました。 ありがとう御座いました!

関連するQ&A

  • httpsクライアントについて

    以下のようなプログラムでhttpsクライアントを作ろうと思ったのですが 何も表示されません。どのようにしたらよいかアドバイスをいただけない でしょうか? #!/usr/bin/perl $url='https://www3.idpass-net.sia.go.jp/neko/action/z0401'; &process; print "Content-type: text/html\n"; print "\n"; print $lines; exit(0); sub process { undef $lines; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; ($host,$path) = $url =~m!^https://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'https(443)'); print $socket 'GET ', $path, ' HTTP/1.1', CRLF, 'Host: ', $host, CRLF, CRLF; my $headerN = <$socket>; $lines .= $data while read($socket,$data,1024) > 0; }

  • socketを用いたHTTPクライアントで別のサイトが表示されるのはなぜ?

    以下のようなプログラムでHTTPクライアントを実現しようとしたの ですが、指定したURL($url)と異なるサイトが表示されてしまう場合 があるのはなぜなのでしょうか?(Yahooのトップサイトなどほとんどの サイトは指定したとおりのサイトが表示されるのですが、Yahooの検索 結果(2番目のURL)や東証トップページ(3番目のURL)などは異なる サイトが表示されます。) #!/usr/bin/perl $url='http://www.yahoo.co.jp/'; #$url='http://search.yahoo.co.jp/search?p=%E6%A0%AA&n=30'; #$url='http://www.tse.or.jp/'; &process; print "Content-type: text/html\n"; print "\n"; print $lines; exit(0); sub process { undef $lines; use IO::Socket qw(:DEFAULT :crlf); $/ = CRLF . CRLF; my $data; my ($host,$path) = $url =~m!^http://([^/]+)(/[^\#]*)!; my $socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort => 'http(80)'); print $socket "GET $path HTTP/1.0",CRLF,CRLF; my $headerN = <$socket>; $lines .= $data while read($socket,$data,1024) > 0; }

    • ベストアンサー
    • Perl
  • perlのソケットがうまく作動しません。

    sakuraインターネットサービスでドメインを取得して、通常はそこでサービスを使っているのですが、このページの情報を、自分の持っているもうひとつのホームページ(プロバイダによって与えられたもの)上でも、データを引っ張り出して同じ情報を使いたいと思っているのですがうまくいきません。 どのようにしたらうまくいくものでしょうか? ご教授、宜しくお願い致します。 #!/usr/local/bin/perl $host = "domain.com"; $file = ""; use IO::Socket; print "Content-type: text/html\n\n"; $file = "/"."$file"; $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$host", PeerPort => "host(80)", ); unless ($remote){die "cannnot connect to help daemon on $host";} $remote->autoflush(1); print $remote "GET $file HTTP/1.0\n\n"; while(<$remote>){ print "$_"; }

    • ベストアンサー
    • Perl
  • Perl CGI 「外部ファイルをロードするには...」

    いつもお世話になります。今回もどうかお願いします。 今回は、futomi'sさんの高機能アクセス解析プロを改造して、データファイル 「organization.dat」と「ipaddr.dat」を共有したくて質問させて頂きます。 (取りあえず、前者だけ) どこかのサイトで、下記のようなコードがありました。 +--------------------- #!/usr/bin/perl my $host = "xxx.com"; //自サバの場合 my $file = "data/organization.dat"; use IO::Socket; print "Content-type: text/html\n\n"; my $files = "/"."$file"; my $remote = IO::Socket::INET->new( Proto => "tcp", PeerAddr => "$host", PeerPort => "host(80)", ); unless ($remote){ die "cannnot connect to help daemon on $host"; } $remote->autoflush(1); print $remote "GET $files \n\n"; while (<$remote>){ print "$_"; } +--------------------- これをtest.cgiとしてサーバにアップすると、改行はしてくれないけど一応出力されます。 高機能アクセス解析(acc.cgi)で、organization.datを読込みしている部分は、 my %OrgList = &ReadDef('./data/organization.dat'); だと思います。 この部分が怪しいと思うのですが、どうしたら読込みできるでしょうか。 これ、ず~っと前から考えていましたが、もうギブアップです。 どうか教えて下さい。よろしく、お願いします。

    • ベストアンサー
    • Perl
  • 環境変数HTTP_REFERERを使うには?

    ただ今、CGIで独自のアクセス解析プログラムを作成中です。 相手がアクセスしてきたら、メールに転送して情報を取得出来るようにしたんですが・・・・ リンク元を取得するのに以下のようにやってみたのですが、送られてきたメールは空メール(涙) ソース抜粋 $host = $ENV{'REMOTE_ADDR'}; $ref = $ENV{'HTTP_REFERER'}; open(MAIL,"| $sendmail $mailto"); flock(MAIL,2); print MAIL $host . $ref; flock(MAIL,8); close(MAIL); ホストアドだけを取得するとちゃんと情報が入って返って来るんですよね・・・ すみません、情報を取得できる良い方法は無いでしょうか?

  • ページのアドレスを取得する記述方法を教えてください。

    たとえば、IP、HOSTを取得するには、 $host = $ENV{'REMOTE_HOST'}; $addr = $ENV{'REMOTE_ADDR'}; if(!$host && $addr){ $host = (gethostbyaddr(pack("C4",split(/\./,$addr)),2))[0]; } と記述して、 センドメール部分に、 $host , $addrをどこかに記述します。 これと同じように、ページのアドレスを取得する記述はどうすればいいのか教えてください。

    • 締切済み
    • CGI
  • socketを使用したスクリプトがうまく動きません

    お世話になります。教えて!gooを初めて利用する者です。 Perlは本などを見ながら何とか動かせるレベルです。 この度、socketを使って他サイトを読み込む実験をしてみたところ、以下のコードでGoogleのトップページは読み込めましたがYahoo!のトップは何度やってもちゃんと読み込めません。 失敗している部分は、相対パス指定になっている部分のようです。 リンクや画像など、「http://www.yahoo.co.jp/~」となるはずのところが、「http://127.0.0.1/~」となってしまっています。 また、LWPモジュールというものも試してみましたが、こちらはGoogleのトップの読み込みも失敗しました。症状は上と同じです。 コードは本や有名サイトからそのまま引用してもダメで、多少いじってもやはりダメでした。 一人で解決するのは限界だと思いましたので、分かる方いらっしゃいましたらご助言をお願いいたします。 (試したコードの例↓) use Socket; $addr = (gethostbyname("www.google.co.jp"))[4]; $name = pack("S n a4 x8", 2, 80, $addr); socket(S, PF_INET, SOCK_STREAM, 0) || die "socket"; connect(S, $name) || die "connect"; binmode(S); select(S); $| = 1; select(STDOUT); print S "GET / HTTP/1.0\r\n\r\n"; while (<S>) { print; } close(S);

  • 【 REMOTE_HOSTの値の取得方法について 】

    既製のCGIを設置するのがイッパイイッパイの 初心者ですm(__)m REMOTE_HOSTの値を取得して表示させたいのですが 当方レンタル中のサーバーの初期設定では取得できず 下記の如くの手順で取得するように表示してありましたが どうにも理解できず困っております。 下記の「Perl内」とは何処の事を指しているのか アドバイスを頂きたくお願い申し上げます。 ****以下、該当サーバーの説明文引用***** 【 REMOTE_HOSTの値の取得方法について 】 レンタルサーバーの処理速度を優先して、初期状態ではIPアドレスからDNSの参照をしないように設定している為、REMOTE_HOSTの値を取得したい場合はPerl内で下記の記述をして下さい。 $addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack('C4',split(/\./,$addr)),2) || $addr;

    • ベストアンサー
    • Perl
  • REMOTE_HOST

    APACHE2.xで、REMOTE_HOSTを返すまでの動作がどうなっているか、どなたかわかりませんでしょうか? DNSに問い合わせたものを返すのか、あるいはリクエストに含まれるなんらかの値を返すのか。 というのは、REMOTE_HOSTでリクエスト元のリモホを取得しているのですが、一部リクエストでREMOTE_HOSTが偽装されているようなのです。 ネットで調べても、内部で問い合わせているだけという話もあれば、偽装は可能なのでREMOTE_HOSTとREMOTE_ADDRを比較することは有効という話もあり… APACHEの仕様書も見つからず…

  • IP/ホスト連続投稿チェック機能が上手く行かない。

    なんでだろ?? ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ## SUB >>> ホスト取得処理 ###+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ sub get_HostAgent { $Host = $ENV{'REMOTE_HOST'}; $Addr = $ENV{'REMOTE_ADDR'}; if ($Host eq '') { $Host = $Addr; } if ($Host eq $Addr) { $Host = gethostbyaddr(pack('C4',split(/\./,$Host)),2) || $Addr; } $H_A = "$Host"; } ホスト取得ルーチンにある変数で、 いろんな掲示板の中のP/ホスト連続投稿チェック機能だけ抜き出して、 もう何十個も試したけれど、上手くいきません。 カスタマイズしてる会員掲示板に、 IP/ホスト連続投稿チェック機能を付けたいのですが上手くいきません。 二重投稿チェックはあるのですが、、 ↓↓↓ #--二重投稿チェック--# if ($r1 eq "$name" && $r4 eq "$street<>$title" && $r5 eq "$comment") { &lock2; &error("二重投稿は禁止です"); } より極めるために、以下を利用したいのです。。 ↓↓↓ #--IP/ホスト連続投稿チェック--# if ($Addr = $ENV{'REMOTE_ADDR'} && $^T - $time < 120) { &lock2; &error("連続投稿はできません。<BR>時間をおいてから書き込みして下さい");} 宜しくお願い致します。 どこがおかしいのかサッパリです。 なんとか機能を追加できるようにお願いしますろ

    • 締切済み
    • CGI

専門家に質問してみよう