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で質問しましょう!
似たような質問が見つかりました
- Perl Perlのエラーについてご教授ください。初心者です。 CGIを別サーバに移したところ、Perlのバー 5 2023/05/31 10:48
- FTTH・光回線 グローバルIPアドレスの変更について 1 2022/04/23 05:32
- VPN DNS「8.8.8.8」とは何なのでしょうか? 固定 IP アドレスで光回線の代わりに使えますか? 4 2022/10/17 16:30
- その他(インターネット接続・インフラ) アプリ利用者を特定し、裁判に 2 2022/06/09 21:43
- Mac OS Macで Microsoft Remote Desktop を使うとキーボードの配列が変わってしまう 1 2022/08/08 17:27
- ネットワーク cutestat.comというサイトでipアドレスが確認できる件 1 2022/04/10 14:19
- その他(ソフトウェア) Unity Remoteを使う手順 1 2023/06/21 14:26
- ネットワーク 自作のサーバーPCが自宅内のネットワークに接続できない 3 2023/01/24 16:58
- その他(プログラミング・Web制作) このプログラミング誰か教えてくれませんか 4 2022/04/29 15:56
- その他(ソフトウェア) Microsoft Store Guitar Pro購入後の質問 1 2022/08/11 17:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
社外からのアクセスかどうか判...
-
クライアントのIPとマシン名を...
-
よくある 『 第○(1・2・3・4・...
-
エクセルで毎月第2週日の水曜日...
-
月の第一週とは
-
毎○曜日って、使いますか?
-
週2回のペースって だいたい何...
-
perlでHTTP Request Headersの...
-
今週とは何曜日から何曜日まで...
-
日付から曜日を求めたい
-
入力した日は何曜日か
-
Content-type: text/htmlが表示...
-
アンケートなどの1日1回の投...
-
VBA。複数のChangeイベントをま...
-
C# FTPサーバ カレントディレ...
-
エクセルで相対パスの書き方を...
-
週休3日制で土日の他にもう一日...
-
DBを10件毎に表示ページング...
-
useとrequireでエラー
-
http://から始まるファイルの更...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クライアントのIPとマシン名を...
-
HttpClientを利用してのサービ...
-
プロキシサーバ経由を拒否したい
-
webサーバでクライアントを特定...
-
perlの環境変数 ENV{'REMOTE_A...
-
社外からのアクセスかどうか判...
-
BASE64でエンコードしてPOSTし...
-
プロキシ経由でNet::FTPを利用...
-
strutsでのgetInputStream
-
LOGON_USER
-
Androidアプリで外部データベー...
-
ブラウザセッションを自動で切...
-
リファラーの取得方法
-
ネットワーク上のサーバーの空...
-
IPとホスト名の変換について
-
プロキシのキャッシュを無効に...
-
URLConnection Timeoutエラー
-
携帯端末向け サーバサイドCook...
-
Perlでの$ENV{REMOTE_ADD}の信...
-
Outlook Expressの受信トレイに...
おすすめ情報