- 締切済み
IPアドレスについて
あるサイトからリンクしてきた人だけに見せたいページがあります。 しかしリンク元のサイトはリファラーをだしておらず、IPアドレスしかわかりません。 その場合、リンク元のIPアドレスでアクセスを制限させるというCGIは作成可能でしょうか。 ベーシック認証は利用できないサーバーです。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- ralf124c
- ベストアンサー率52% (232/446)
はじめましてralf124cと申します。 CGIでは環境変数を参照することでリファラ情報は取得可能ですが、HTTPにおいてリファラー情報は必須情報ではありません。 個人情報としてみる向きもあり、セキュリティソフト(例:NortonSecurity)などをエンドユーザーがインストールしているとデフォルトでこの情報はブロックされてしまいますし、Netscapeなどでは設定でブロックすることもできます。 よってリファラ情報を当てにしたページ作りは避けることをおすすめします。どうしてもそういう特殊な環境の方を除外するということが前提であれば環境変数を参照して判定文で振り分ければよいと思います。 perlでは foreach(sort keys %ENV){ print "$_: $ENV{$_}\n"; } でリファラを含む一部の環境変数を参照できます。
- is907
- ベストアンサー率55% (5/9)
リファラーはリンク元のサイトが出すものではなく、一人一人のユーザーが出すものです。ユーザーの IP アドレスだけからでは、どこからリンクしてきたのかは分かりません。 要求する動作がいまいち掴めないのですが、自分のサイト内から飛んできた人にしか見せたくないというのであれば、リファラーをチェックするか、リンク元として許可するページで Cookie を渡して、目的のページでそれをチェックしてあげればいいと思います。 No.1 の方の回答は単純に、IP アドレスによるアクセス制限ですね。
- nyaa519323116
- ベストアンサー率51% (41/79)
で、アクセス元のIPアドレスが分かるので、これをもとに制限をかけるということはできます。 私はファイルでアクセス禁止のIPアドレスのリストを登録しておき、このファイルを読み込ませて、一致した場合にはアクセスを禁止するという制御をしています。こんなイメージです。 $denyに禁止IPアドレスリストが空白をデリミタにして入っています。 $addr = $ENV{'REMOTE_ADDR'}; foreach (split(/\s+/, $deny)) { if (/^#/) { next; } s/\./\\\./g; # . をエスケープする s/\*/\.\*/g; # * をエスケープする s/\?/\.\?/g; # ? をエスケープする if ($addr =~ /$_/i) { die "Accessed by a prohibited host"; } } }