dポイントプレゼントキャンペーン実施中!

Perlでの$ENV{REMOTE_ADD}の信ぴょう性を教えてください。

Perlによる、CGIサイトを運営しています。
IPアドレスを$ENV{REMOTE_ADD}で取得し、Firewall内プライベートアドレス(10.*.*.*)以外はloginをしないと内容が表示されないようにスクリプトをつくり、Firewallの内外から動作確認し、きちんと動いていたのでそのまま運用していました。
ところが、先日海外(ハワイ)に行った際、アップルストアでそのサイトにアクセスした際にloginなしで内容が表示されてしまいました。

アップルストアに置いてあったPCなので、IP偽装などは行っていないと思われますので、どうして見えるのだろうかわかりません。
$ENV{REMOTE_ADD}で取得した値は信ぴょう性がないのでしょうか?それとも、10.*.*.*はグローバルアドレスとして使用可能なのでしょうか?

A 回答 (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へのアクセスを確認することで、どういうアクセス元に対して誤動作したのかがわかるので情報として参考になるでしょう。
    • good
    • 1
この回答へのお礼

ありがとうございました。
ご指摘の通り、正規表現を間違えているようです。

@Permit_ip = ("10.*.*.*","172.16.8.*")

if (grep { $ENV{'REMOTE_ADDR'} =~ /$_/ } (@Permit_ip) ) ....

で行ってました。修正して運用するようにします。

お礼日時:2010/10/27 16:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!