柔軟に働き方を選ぶ時代に必要なこと >>

あるサイトからリンクしてきた人だけに見せたいページがあります。
しかしリンク元のサイトはリファラーをだしておらず、IPアドレスしかわかりません。

その場合、リンク元のIPアドレスでアクセスを制限させるというCGIは作成可能でしょうか。

ベーシック認証は利用できないサーバーです。

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

はじめましてralf124cと申します。


CGIでは環境変数を参照することでリファラ情報は取得可能ですが、HTTPにおいてリファラー情報は必須情報ではありません。
個人情報としてみる向きもあり、セキュリティソフト(例:NortonSecurity)などをエンドユーザーがインストールしているとデフォルトでこの情報はブロックされてしまいますし、Netscapeなどでは設定でブロックすることもできます。
よってリファラ情報を当てにしたページ作りは避けることをおすすめします。どうしてもそういう特殊な環境の方を除外するということが前提であれば環境変数を参照して判定文で振り分ければよいと思います。
perlでは
foreach(sort keys %ENV){ print "$_: $ENV{$_}\n"; }
でリファラを含む一部の環境変数を参照できます。
    • good
    • 0

リファラーはリンク元のサイトが出すものではなく、一人一人のユーザーが出すものです。

ユーザーの IP アドレスだけからでは、どこからリンクしてきたのかは分かりません。

要求する動作がいまいち掴めないのですが、自分のサイト内から飛んできた人にしか見せたくないというのであれば、リファラーをチェックするか、リンク元として許可するページで Cookie を渡して、目的のページでそれをチェックしてあげればいいと思います。

No.1 の方の回答は単純に、IP アドレスによるアクセス制限ですね。
    • good
    • 0

で、アクセス元の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";
}
}
}
    • good
    • 0

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


人気Q&Aランキング