

Perlでの$ENV{REMOTE_ADD}の信ぴょう性を教えてください。
Perlによる、CGIサイトを運営しています。
IPアドレスを$ENV{REMOTE_ADD}で取得し、Firewall内プライベートアドレス(10.*.*.*)以外はloginをしないと内容が表示されないようにスクリプトをつくり、Firewallの内外から動作確認し、きちんと動いていたのでそのまま運用していました。
ところが、先日海外(ハワイ)に行った際、アップルストアでそのサイトにアクセスした際にloginなしで内容が表示されてしまいました。
アップルストアに置いてあったPCなので、IP偽装などは行っていないと思われますので、どうして見えるのだろうかわかりません。
$ENV{REMOTE_ADD}で取得した値は信ぴょう性がないのでしょうか?それとも、10.*.*.*はグローバルアドレスとして使用可能なのでしょうか?
No.1ベストアンサー
- 回答日時:
REMOTE_ADDR は、そのCGIを動かしているWWWサーバがCGIのために付けている情報です。
接続元のIPアドレスが正しくないと、TCP/IPによる通信そのものが成り立ちませんから、詐称はできません。
(TCP/IPの通信は文通みたいなものです。差出人住所を詐称した場合、手紙を一方的に送ることはできても、詐称したまま文通(相互に何度も手紙のやりとり)をすることはできません。文通できているということは、差出人住所は詐称ではないということです。同じように、TCP/IPで通信できているということは、相手のIPアドレスは詐称ではないということになります。)
ですので「REMOTE_ADDR がWWWサーバの通信相手のIPアドレスを示している」ことについては信用して問題ありません。
ただし、この情報はあくまで「WWWサーバの通信相手」のIPアドレスですから、proxyを通してアクセスした場合には、REMOTE_ADDR はproxyのIPアドレスになります。
WWWサーバが、インターネット外部に対して reverse proxy を通して公開するような環境になっている場合には、WWWサーバ自身はproxyと通信していますから、proxy自体がfirewall内にあれば、そのIPアドレスが10.*.*.* である、という環境はありえます。ですが、質問者さん自身がfirewall内外での動作確認をしているとのことなので、この可能性はないでしょう。
そうなると、質問者さんの状況では、「REMOTE_ADDRのチェック方法が間違えている」可能性が高いのではないかと思います。
正規表現/^10\.\d+\.\d+\.\d+$/でチェックしているのなら大丈夫だと思いますが、例えば、
正規表現/10\.\d+\.\d+\.\d+/でチェックしてたりする(前後に^/$が無い)と、その前後に何か文字が入っていてもマッチしますから、「210.3.4.5」もマッチするといったことになります。
REMOTE_ADDRのチェックをしているコードを補足で出してくれれば、そのあたりについてのアドバイスができるかもしれません。
あと、WWWサーバのアクセスログが残っているのであれば、そのCGIへのアクセスを確認することで、どういうアクセス元に対して誤動作したのかがわかるので情報として参考になるでしょう。
ありがとうございました。
ご指摘の通り、正規表現を間違えているようです。
@Permit_ip = ("10.*.*.*","172.16.8.*")
if (grep { $ENV{'REMOTE_ADDR'} =~ /$_/ } (@Permit_ip) ) ....
で行ってました。修正して運用するようにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Strawberry Perl for Windows ...
-
INDIRECT 横に再度抽出したい
-
Perlのエラーについてご教授く...
-
bashスクリプト
-
perlで2次元配列をサブルーチ...
-
Perlの全角スペース 文字化け?
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
perlのflock関数でロックをかけ...
-
AI sisterとは、偽物の人ですか?
-
ファイルアイコンの左下に緑の□...
-
perlプログラミング 空白行削除
-
perlでリテラル値はメモリにど...
-
Perlで時間の計算
-
perlについて
-
perlのrequireの動き方について...
-
perlの構文でカンマの意味が分...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クライアントのIPとマシン名を...
-
webサーバでクライアントを特定...
-
perlの環境変数 ENV{'REMOTE_A...
-
HttpClientを利用してのサービ...
-
URLConnection Timeoutエラー
-
携帯端末向け サーバサイドCook...
-
mod_rewriteの環境変数を埋め込...
-
社外からのアクセスかどうか判...
-
月の第一週とは
-
エクセルで毎月第2週日の水曜日...
-
エクセルで相対パスの書き方を...
-
毎○曜日って、使いますか?
-
週2回のペースって だいたい何...
-
VBA。複数のChangeイベントをま...
-
[Excel] ある日の曜日が当月の"...
-
よくある 『 第○(1・2・3・4・...
-
DBを10件毎に表示ページング...
-
アンケートなどの1日1回の投...
-
ユーザー定義の(aaa)
-
jcode.plが読み込めない
おすすめ情報