WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:リンク制限

0:[投稿] LIRIC [2006/05/08 00:42 ] [環境:、IE6,WINXP CGI,perl ]

或るページにリンクする時、特定のリンク元を指定する方法は有るでしょうか。

具体的には、HPのページに飛ぶとき、必ずトップページを
経由するようにし、トップページ以外から来た場合はトップページに
戻るようにしたいのです。


1:[回答] ふ [2006/05/08 07:15 ]

初めまして LIRICさん
お役に立てるほどの知識を持っていないので不安ですが

javascriptのreferrerにてtoppage経由か否かを判断する
しかしjavascriptがonであることが条件です。またreferrerは100%とれなかったような?

別の方法としてはcookieによる判断も一つの方法です。
しかしこれもcookieを受け入れる設定でないとできません。

他の方法もあるかも?
上記2点お役に立てれば幸いです。


2:[関連] LIRIC [2006/05/08 11:49 ]

有難うございます。
referrerもクッキーも一応、考えたのですが、漏れがあって駄目なので
他の方法はないか捜しているのですが・・・・


3:[回答] EUR [2006/05/08 15:22 ]

トップページを経由させたいページをCGIプログラムで作成するとうまくいくかもです。
トップページでは、hiddenタグに経由した情報を入れておき、リンク先ページで経由情報を確認するというのはいかがでしょう?

トップページにて
  <input type="hidden" name="AccessByWayOfTop" value="OK">
を仕込んでおきます。

リンク先のページでは、「AccessByWayOfTop」の内容を解析し、値が「OK」であれば、コンテンツを表示します。
「AccessByWayOfTop」がなかったり、値が「OK」でなければ、
  <meta http-equiv="Refresh" content="5;URL=トップページ">
  <body>直リンは禁止されています。5秒後にトップへ移動します。<br><br><a href="トップページ">移動しない場合はこちら</a></body>
などを表示し、トップページへ戻します。

ただし、リンク先ページへのリンクをPOSTで送信しなければならないという弊害があるかもです。


4:[回答] LIRIC [2006/05/08 15:46 ]

折角、回答いただいたのですが、cgiは殆ど解らないので
良く理解できません。
javascript で何とかできないものでしょうか。
または、cgiのサンプルプログラムはないものでしょうか。


5:[質問] LIRIC [2006/05/08 17:20 ]

リンク元のurlを判定するcgiを見つけたのですが
下記のところの意味が解りません。
教えていただけませんか。


$ENV{'HTTP_REFERER'}=~ s/%(..)/pack("C",hex($1))/eg;
if($ENV{'HTTP_REFERER'}){
    for(@url){
        if($_ && $ENV{'HTTP_REFERER'} =~ /^\Q$_\E/){
            $flag = 1;
            last;


6:[回答] かんな [2006/05/09 00:50 ][URL]

リファラーのURLエンコードをデコードして置換(!)した上に、配列@urlの各要素と比較してどれかと一致していれば、$flagを真にしています。

なんと恐ろしい正規表現の使い方……。真似しない方がいいでしょう。


7:[質問] LIRIC [2006/05/09 07:27 ]

前の質問で書いたcgiを試しに使った見たら、或るリンク元だけが、リンクOKにしているにも拘らず拒否されてしまいます。
(他のリンク元はうまくいきます)
下記プログラムでHTTP_refererの内容を表示させたいのですが
どのような命令を何処に入れたらよいか教えていただけませんか。


8:[質問] LIRIC [2006/05/09 11:04 ]

度々、済みません。

その後、色々調べてみたら
リンク元をパスワードを入れてリンクするページに指定すると
$ENV{'HTTP_REFERER'}が空白のまま返され拒否されてしまうことがわかりました。
リンク元で、そのURLを$ENV{'HTTP_REFERER'}に入れて
cgiに返すことは出来ないでしょうか。


9:[回答] かんな [2006/05/09 11:16 ][URL]

あのー状況が全くよくわからないのですが、もしhttpsからhttpへのリンクでRefererが送出されないことを言ってるのなら、それは仕様ですのでどうしようもありません。

http://www.studyinghttp.net/cgi-bin/rfc.cgi?2616#Sec15.1.3


10:[質問] LIRIC [2006/05/09 13:51 ]

基本的なことをお伺いします。
cgiにリンクしようとした時、$ENV{'HTTP_REFERER'}でリンク元の
URLを取得し、リンクの可否を判断する場合(判断ルーチンは共通サブルーチンになっていてcgiの先頭でrequireで呼び出しています)

或るcgiにリンクしようとするときのみ、$ENV{'HTTP_REFERER'}が
空白で返って来て全て拒否されるのですが、一旦、
$ENV{'HTTP_REFERER'}で返ってきたURLを空白に置き換えサブルーチンに渡すようなことがメインのcgi側で出来るものなのでしょうか。

この現象は、上記のことでしか説明できないような気がするのですが・・・


11:[質問] LIRIC [2006/05/09 13:57 ]

補足します。
拒否されるのはhttpsではなく普通のhttpです。


12:[回答] かんな [2006/05/09 16:20 ][URL]

>$ENV{'HTTP_REFERER'}で返ってきたURLを空白に置き換えサブルーチンに渡すようなことがメインのcgi側で出来るものなのでしょうか。

ハッシュ %ENV には、その時点の環境変数が設定されています。%ENV に値を設 定することで、チャイルドプロセスの環境変数を変更します。<http://namazu.org/~tsuchiya/perl/info/perl-ja_68.html#SEC68>


13:[回答] LIRIC [2006/05/09 17:13 ]

説明の仕方が悪くて済みません。

特定のcgiにリンクするときのみ、全て拒否されるということは
リンク先のcgiに問題があると考えざるを得ないのですが
リンクするcgiの先頭でrequire '****.pl'で判断ルーチンを呼び出した時点(まだ、リンク先へ渡してない)で
$ENV{'HTTP_REFERER'}が空白になっている事がどうしても理解できません。

(printタグで確認した所、リンクできるcgiの場合は
 $ENV{'HTTP_REFERER'にリンク元のURLが入っています)


14:[回答] かんな [2006/05/09 19:29 ][URL]

requireはファイルをPerlスクリプトとして実行するはずなので、サブルーチン実行前に環境変数を書き換えることも、不可能ではないです。


15:[回答] LIRIC [2006/05/09 20:31 ]

解りました。
ただ、私の力量では理解を超えている部分もあります。
環境変数を書き換えている場所を探して修正することは
難しいのでしょうか。


16:[回答] かんな [2006/05/12 08:49 ][URL]

requireされているファイルの冒頭で(もちろんpackageの後に)、local $ENV{'HTTP_REFERER'};としてやれば、リファラーの変更をそのパッケージに制限できるということを今朝思いつきました。

回答(必須): 状態:

お名前(必須):

URL:




[戻る]