HTTP_REFERERの信頼性について

[上に] [前に] [次に]
フシギダネ 2000/03/07(火) 11:49:13
$ENV{'HTTP_REFERER'}の信頼性について教えて下さい。
IE,NNともVersion4以上で運用しようと考えています。

びーだま [E-Mail] 2000/03/07(火) 12:51:50
信頼性は低いです。
HTTP要求レベルで自由に書き換え可能です。

クライアントが勝手なものを送る場合、プロクシサーバーが勝手に
変更する場合や消してしまうものなど様々です。

環境変数のうち、HTTP_ で始まるものは、全て同レベルでいずれも
低い信頼性です。

フシギダネ 2000/03/07(火) 20:30:45
ありがとうございます。
では、CGIでリンク元を限定したいのですが、何か良い方法はないでしょうか?

andi 2000/03/07(火) 20:48:38
信頼性は低くても多くの人は手を加えず送ってくれるようなので
普通で良いと思いますよ。

むぅす 2000/03/07(火) 21:48:42
CGIでしたら

$httpr_url = '許可するURL';
$httpr = $ENV{'HTTP_REFERER'};
$httpr =~ tr/+/ /;
$httpr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if (!($httpr =~ /$httpr_url/i)) { &error; }
while (<DATA>) { print; }
sub error {
print "Content-type: text/html\n\n";
print <<'EOF';
<HTML><HEAD><TITLE>エラー</TITLE></HEAD>
<BODY>エラーです。</BODY></HTML>
EOF
exit;
}

とか、やればいいと思います。

フシギダネ 2000/03/08(水) 21:42:21
リンク元限定をHTTP_REFERERを使用せずに行いたいのですが。

姫月統太 [E-Mail] [HomePage] 2000/03/08(水) 22:40:51
JavaScriptで document.referrer を取ってCGIに送る、ぐらいですかね?

むぅす 2000/03/08(水) 23:23:06
>リンク元限定をHTTP_REFERERを使用せずに行いたいのですが。

姫月統太さんが仰っている様に
JavaScriptで出来ますが
JavaScriptでプロパティ referrer
CGIで 環境変数 HTTP_REFERER と言うだけで
どちらも、ブラウザが出すReferrer要求ヘッダを取得するので
信頼性は同じです。

あと、Referrerを出さないブラウザもありますよ。

2000/03/08(水) 23:26:13
信憑性が低いから$ENV{'HTTP_REFERER'}を使いたく無いんですよね?だったらdocument.referrerも同じでしょう。
そもそも HTTP_REFERER送ってこないAGENTも結構あるから無理だと思う。

むぅす 2000/03/09(木) 02:00:03
>リンク元限定をHTTP_REFERERを使用せずに行いたいのですが。

その限定と言うのが、直リンク一切禁止というのであれば

>if (!($httpr =~ /$httpr_url/i)) { &error; }

上記ですとReferrerを出さないブラウザや
ブックマーク等からの場合はダメですので

if ($httpr eq ""){
}elsif (!($httpr =~ /$httpr_url/i)) { &error; }

JavaScriptは知りません(^^;;

びーだま [E-Mail] 2000/03/09(木) 04:29:47
これは、かなりの難題ですね。。。
解決のためにクッキーつかっちゃって良いですか?

サイトのトップページからのリンク訪問なら許可し、その他のサイト
のトップページ以外からのリンクで来た時には、閲覧禁止にするか、
一度トップページに行ってもらい、そこから辿ってもらおうという
試みについて考えました。

実際に試したわけではないのですが、おそらく可能な方法であると
思います。

トップページ(たとえば、index.html ) に来たときに何かの方法で
クッキーを渡す。方法は、CGIでも、JavaScriptでも、META など、
いずれでも良いでしょう。

自サイト内からリンクを施す場合はすべて、<A href="location.cgi?
URL指定">あああ</A> みたいな感じとし呼び出されるようにして、
この location.cgi 内での処理(Perl風味な表現で)は、

if (URL指定が自分のサイトのパターン)
  if (クッキーを持っている) {
    print "Location: URL指定\n\n";
  } else {
    とりあえず、トップページなどにとばす。
  }
} else {
  # 外部サイトの URL に行くときはクッキーは始末しておく。
  クッキーを期限切れにする;
  print "Location: URL指定\n\n";
}

とし、

トップページ以外の一般ページでは、SSI の exec とかでトップページ
でもらえる Cookie を調べることができるプログラムを仕組んでおき、
CooKie を持っていれば、あらかじめ保存されているソースをオープンして表示、
持っていなければ「クッキーを許可しなければ閲覧権がない」などのエラーを表示する。
<全ページCGIでLocation:でトップに戻すでも可>

みたいにしておくのはどうでしょう?
欠点としては、クッキーを食べてもらえないと、その人には、トップページ
ページかまたは閲覧権エラーばかり見せてしまうことかな。

でも、もう少しスマートなやりかたもある気もするなぁ・・・
いまは考えつかないけど・・。 惜しいところまでは結構いくつ
か思いつくんですけどね、、。なんかいい方法ないかな。。

フシギダネ 2000/03/09(木) 09:04:15
いろいろ考えて下さって、ありがとうございます。
>びーだまさん
>} else {
>  # 外部サイトの URL に行くときはクッキーは始末しておく。
>  クッキーを期限切れにする;
>  print "Location: URL指定\n\n";
>}
外部サイトへ行く時このCGIを必ず経由するなら、Cookieの始末はできますが、ブックマークやURL直接入力で外部サイトへ行ったらCookieを始末できませんよね。

むぅす 2000/03/09(木) 10:08:32
トップページでまず
exexを使ってIPアドレスと時間を保存して
自分のサイト内へのリンク先のページで
exexを使ってトップページで取得したIPアドレスと時間を参照して
IPアドレスが一致してさらにその時間から2時間以内であれば許可するなどはどうでしょう。
すでにびーだまさんが思いついているかも。

フシギダネ 2000/03/09(木) 10:26:30
ありがとうございます。

話をもう一度整理します。
対象となるページ(CGI)は、
@URL直打ちはNG
A同一サイト内からのリンクはOK
B外部サイトからでもサイトを絞ってリンクを許可したい。
 (つまり勝手にリンクを貼られたりするのはNG)

>むっすさん
>exexを使ってトップページで取得したIPアドレスと時間を参照して
>IPアドレスが一致してさらにその時間から2時間以内であれば許可するなどはどうでしょう。
これは、必ず1度は自分のサイトにアクセスするという前提になっちゃいますよね。

むぅす 2000/03/09(木) 12:43:54
>B外部サイトからでもサイトを絞ってリンクを許可したい。
> (つまり勝手にリンクを貼られたりするのはNG)

この制限でReferrerを使わないのであれば
その許可するサイトのリンク集(とは限りませんが)のページに
何らかの仕掛けをしてもらうしかないのでは?
<IMG SRC=http://domain/link.cgi>などを記述してもらってIP等を取得するなど。

2000/03/09(木) 13:13:42
>@URL直打ちはNG
>A同一サイト内からのリンクはOK
>B外部サイトからでもサイトを絞ってリンクを許可したい。
> (つまり勝手にリンクを貼られたりするのはNG)
HTTP_REFERERと許可アドレステーブルをぶつければ良いんじゃないですか?
1はHTTP_REFERERが入ってないので跳ねられるし、
2は何十個も無いだろうし、
3もテーブルに登録するだけ
もっとも該当するHTTP_REFERERを吐かれたら元も子もないけど。

# まる付き数字 使ったから B-○asさんが出てくるぞ(笑)

びーだま [E-Mail] 2000/03/09(木) 13:54:45
> フシギダネさん
> 外部サイトへ行く時このCGIを必ず経由するなら、Cookieの始末はできますが、
> ブックマークやURL直接入力で外部サイトへ行ったらCookieを始末できませんよね。

なるほど!そういうパターンもありますね・・・。
では、CGI だけで処理するのは難しそうですね。。

そこで、JavaScript を使ってなんとかする方法を考えてみました。

直接リンクが許可されたページ(たとえばトップページ)では、

1.処理フラグを初期化する。
2.onLoad で document.cookie を調べる。
3.持っていなければ、Cookie を与える。

直接リンクが許可されたページ以外の全てのページでは、

1.処理フラグを初期化する。
2.document.cookie を調べる。
3.Cookie を持っていなかったら
   → 特定のページ(たとえばトップページ)などに飛ばす。
  Cookie を持っていたら
   → 何もしない

 <ここでは、SSI や CGIで、Cookie を調べて、あれば、読み出しな
 ければ、閲覧権エラー などとする処理も可能だと思います。>

サイト内でリンクするときは、JavaScript でジャンプファンクション
を作っておいて、必ずそこを経由させるようにする。

例 : <A href="javascript:jump('URL指定')">あああ</A>

外部サイトへのリンクは普通で良い。

ジャンプファンクション内の処理は

1.処理フラグを立てる。
2.location.href に与える。

サイト内の全てのページで、 onUnload イベントで、
1.処理フラグを調べる。
2.処理フラグが初期状態なら、
   → Cookie を期限切れにする。
  処理フラグが立っていたら、
   → 何もしない。

【処理のポイント】
 処理フラグが立つ場合は、ジャンプファンクションが呼ばれたとき
 です。ジャンプファンクションが利用できるのはサイト内でリンク
 させる時だけですから、これなら、ブックマークやURL直接入力
 で外部サイトに行く場合は処理フラグを立てる事が出来ないので、
 ページのアンロード時にこれを判断材料として挙動を制御できます。

欠点は、クライアントが、JavaScript、クッキーを利用するように
していることが必要なことですね。

最後に、みなさんの案にいくつか出ている、IP アドレスを用いて管理
する方法は、同じプロクシなどの経由でのアクセスが近い時簡易重なる
と、思いも掛けない動作を別のユーザーに見せる可能性があるので、
あまり良い方法ではないと思います。

むぅす 2000/03/09(木) 14:08:31
>最後に、みなさんの案にいくつか出ている、IP アドレスを用いて管理
>する方法は、同じプロクシなどの経由でのアクセスが近い時簡易重なる
>と、思いも掛けない動作を別のユーザーに見せる可能性があるので、
>あまり良い方法ではないと思います。

やはり、プロキシーでつっこまれると思っていました。
それでは、さらにブラウザ種類を取得するとか。
何れにせよ、完璧では無いのですよね〜
う〜む

びーだま [E-Mail] 2000/03/10(金) 00:28:42
これは、かなりの難題ですね。。。
解決のためにクッキーつかっちゃって良いですか?

サイトのトップページからのリンク訪問なら許可し、その他のサイト
のトップページ以外からのリンクで来た時には、閲覧禁止にするか、
一度トップページに行ってもらい、そこから辿ってもらおうという
試みについて考えました。

実際に試したわけではないのですが、おそらく可能な方法であると
思います。

トップページ(たとえば、index.html ) に来たときに何かの方法で
クッキーを渡す。方法は、CGIでも、JavaScriptでも、META など、
いずれでも良いでしょう。

自サイト内からリンクを施す場合はすべて、<A href="location.cgi?
URL指定">あああ</A> みたいな感じとし呼び出されるようにして、
この location.cgi 内での処理(Perl風味な表現で)は、

if (URL指定が自分のサイトのパターン)
  if (クッキーを持っている) {
    print "Location: URL指定\n\n";
  } else {
    とりあえず、トップページなどにとばす。
  }
} else {
  # 外部サイトの URL に行くときはクッキーは始末しておく。
  クッキーを期限切れにする;
  print "Location: URL指定\n\n";
}

とし、

トップページ以外の一般ページでは、SSI の exec とかでトップページ
でもらえる Cookie を調べることができるプログラムを仕組んでおき、
CooKie を持っていれば、あらかじめ保存されているソースをオープンして表示、
持っていなければ「クッキーを許可しなければ閲覧権がない」などのエラーを表示する。
<全ページCGIでLocation:でトップに戻すでも可>

みたいにしておくのはどうでしょう?
欠点としては、クッキーを食べてもらえないと、その人には、トップページ
ページかまたは閲覧権エラーばかり見せてしまうことかな。

でも、もう少しスマートなやりかたもある気もするなぁ・・・
いまは考えつかないけど・・。 惜しいところまでは結構いくつ
か思いつくんですけどね、、。なんかいい方法ないかな。。

びーだま [E-Mail] 2000/03/10(金) 00:30:14
↑あ、ごめんなさい。
おうちに帰ってきて、朝書いていた文章が、キャッシュに残っており、
リロードしてしまったら、送られていってしました。

無視してください。

[上に] [前に] [次に]