WEB相談室

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

タイトル:特定サイトからのアクセス拒否について

0:[投稿] hide [2007/03/05 12:24 ] [環境:IE6、Win2000 わからない]

お願い致します。

歓迎しないサイト(ページ)からのアクセスを拒否したいと思います。
が、サーバがbiglobeな為、SSIと.htaccessが使えません。
何か良い方法がありませんでしょうか?

以下、biglobeの仕様です。
http://homepage.biglobe.ne.jp/help/shiyou5b.html


1:[回答] 通りすがり [2007/03/05 15:44 ]

歓迎しないサイト(ページ)のリストがあるんだったらREFERERでアクセス制限する方法はいかがでしょう?


2:[質問] hide [2007/03/05 16:53 ]

すみません、具体的な方法を教えて頂けないでしょうか?
SSIと.htaccess以外だとどの方法になりますか?


3:[回答] 通りすがり [2007/03/05 17:31 ]

とりあえず、Perl側で制限を掛けようとしたとき。
こんなのでどうですか?
@ng_listに拒否したいURLを追加していってください。

#! /usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = CGI::new();
print "Content-type:text/html\n\n";

my @ng_list = ""; # アクセス拒否したいURLリスト
$ng_list[0] = 'http://yahoo.co.jp';
$ng_list[1] = 'http://google.co.jp';

# リファラーの取得
my $http_referer = $ENV{'HTTP_REFERER'};

# アクセス拒否リストとリファラーの比較
my $err_flg = 'OK'; # エラーフラグ
foreach my $wk_ng_list (@ng_list){
 if ($http_referer =~ /$wk_ng_list/){
   $err_flg = 'NG';
   last;
 }
}

# yahoo or googleからアクセスはNG
if ($err_flg eq 'NG'){
print <<"HTML";
<html>
<head>
<title>エラー</title>
<meta http-equiv="content-type" content="text/html;charset=shift_jis">
</head>
<body>
${http_referer}<br>
アクセスできません。
</body>
</html>
HTML
exit;

# それ以外はOK
}else{
print <<"HTML";
<html>
<head>
<title>OKです</title>
<meta http-equiv="content-type" content="text/html;charset=shift_jis">
</head>
<body>
${http_referer}<br>
OKです。
</body>
</html>
HTML
exit;
}


#ちなみに…JavaScriptでも制限でき


4:[回答] 通りすがり [2007/03/05 17:31 ]

とりあえず、Perl側で制限を掛けようとしたとき。
こんなのでどうですか?
@ng_listに拒否したいURLを追加していってください。

#! /usr/bin/perl
use CGI;
use CGI::Carp qw(fatalsToBrowser);
my $cgi = CGI::new();
print "Content-type:text/html\n\n";

my @ng_list = ""; # アクセス拒否したいURLリスト
$ng_list[0] = 'http://yahoo.co.jp';
$ng_list[1] = 'http://google.co.jp';

# リファラーの取得
my $http_referer = $ENV{'HTTP_REFERER'};

# アクセス拒否リストとリファラーの比較
my $err_flg = 'OK'; # エラーフラグ
foreach my $wk_ng_list (@ng_list){
 if ($http_referer =~ /$wk_ng_list/){
   $err_flg = 'NG';
   last;
 }
}

# yahoo or googleからアクセスはNG
if ($err_flg eq 'NG'){
print <<"HTML";
<html>
<head>
<title>エラー</title>
<meta http-equiv="content-type" content="text/html;charset=shift_jis">
</head>
<body>
${http_referer}<br>
アクセスできません。
</body>
</html>
HTML
exit;

# それ以外はOK
}else{
print <<"HTML";
<html>
<head>
<title>OKです</title>
<meta http-equiv="content-type" content="text/html;charset=shift_jis">
</head>
<body>
${http_referer}<br>
OKです。
</body>
</html>
HTML
exit;
}


5:[回答] hide [2007/03/05 17:39 ]

たびたびありがとうございます。
私の場合、このcgiをどう起動する(呼び出す)かが問題でして…

無知ですみません、教えて下さい。


6:[質問] hide [2007/03/05 17:40 ]

すみません、[質問]にするの忘れました。


7:[回答] ティルド [2007/03/05 20:50 ][URL]

どう呼び出すかがわからない、というのなら次のようにしてはいかがでしょう。

- index.html -
<script type="text/javascript" src="access.cgi"></script>
<noscript>JavaScriptをOnにしてください。</noscript>

- access.cgi -
my @sAccessCancel = ("www.yahoo.co.jp/", "www.google.co.jp/");

print("Content-type: application/x-javascript\r\n\r\n");
if (isAccess(@sAccessCancel)) {
 print("document.write('<html><head><title>OK</title></head><body>アクセス完了です。</body></html>');");
} else {
 print("document.write('<html><head><title>Error</title></head><body>アクセスが制限されました。</body></html>');");
}
sub isAccess {
 for(@_) {
   ($_ eq $ENV{'HTTP_REFERER'}) and return 0;
 }
 return 1;
}


JavaScriptが使えないと表示できないようになりますが、HTMLがindexページの場合はこの方法か、iframeを使うしかありません。


8:[質問] hide [2007/03/05 22:48 ]

ありがとうございます。

早速、試してみましたが該当サイトからも「アクセス完了です。」となります。

引き続きお願い致します。


9:[回答] AC1号 [2007/03/06 00:01 ]

>>7
<script src="">で呼び出した場合のRefererは、通常呼び出し元のHTMLリソースのURIになります。


10:[回答] ティルド [2007/03/06 17:24 ]

おっと、失礼いたしました。

↓改正版です。


- index.html -
<script type="text/javascript">
document.write("<" + "script type='text/javascript' src='access.cgi?" + document.referrer + "'" + ">" + "<" + "/script" + ">");
</script>
<noscript>JavaScriptをOnにしてください。</noscript>

- access.cgi -
my @sAccessCancel = ("www.yahoo.co.jp/", "www.google.co.jp/");

print("Content-type: application/x-javascript\r\n\r\n");
if (isAccess(@sAccessCancel)) {
print("document.write('<html><head><title>OK</title></head><body>アクセス完了です。</body></html>');");
} else {
print("document.write('<html><head><title>Error</title></head><body>アクセスが制限されました。</body></html>');");
}
sub isAccess {
for(@_) {
  ($_ eq $ENV{'QUERY_STRING'}) and return 0;
}
return 1;
}


恐らく動きます。またおかしかったらすみません;


11:[質問] hide [2007/03/06 17:42 ]

何度もありがとうございます。

該当サイトからは「アクセスが制限されました。」と表示されるようになりました。
が、ページ(index.html)自体は表示されてしまいます。

body直下に記述しています。
<body>
<script type="text/javascript">
document.write("<" + "script type='text/javascript' src='access.cgi?" + document.referrer + "'" + ">" + "<" + "/script" + ">");
</script>
<noscript>JavaScriptをOnにしてください。</noscript>

こちらのミスでしょうか?


12:[回答] ティルド [2007/03/06 20:48 ]

私は、<html>〜</html>を省いて書いているわけではありません。
index.htmlには
<script type="text/javascript" src="access.cgi"></script>
<noscript>JavaScriptをOnにしてください。</noscript>
だけでいいのです。他はいりません。
ページの内容は
print("document.write('<html><head><title>OK</title></head><body>アクセス完了です。</body></html>');");
の中に書いてください。

・・・という考えでこれを書いたのですが。。。


あなたはindex.htmlにページを書き込んでいるのでしょうか。
それでは、ソースの表示をするだけで見れてしまうので、せっかくのアクセス制限も意味がありません。
と、言いたいところですが、それとも完全なアクセス制限は必要ないのでしょうか。
しかし、やっぱり私が先ほど書いた方法だと、かなりめんどくさいですよね・・・。二重符(")を使うとエラーになりますし。
そこで新しいのを作ってみたので、自分のお好きな方をご使用ください。
(念のため、何も省いてません。)

- index.html -
<script type="text/javascript">
document.write("<" + "script type='text/javascript' src='access.cgi?" + document.referrer + "'" + ">" + "<" + "/script" + ">");
</script>
<noscript>JavaScriptをOnにしてください。</noscript>

- access.cgi -
my @sAccessCancel = ("www.yahoo.co.jp/", "www.google.co.jp/");

print("Content-type: application/x-javascript\r\n\r\n");
if (isAccess(@sAccessCancel)) {
    print("location.replace = 'top.html';");
} else {
    print("document.write('<html><head><title>Error</title></head><body>アクセスが制限されました。</body></html>');");
}
sub isAccess {
    for(@_) {
        ($_ eq $ENV{'QUERY_STRING'}) and return 0;
    }
    return 1;
}


- top.html -
(このファイルに自分の好きなものを書いてください。)


変更部分はprint("location.replace = 'top.html';");だけです。
top.htmlは自分の好きな名前で。hoge.htmlにしてもOKです。
というか、明らかに今書いたものの方がいいですね。。。
グダグダな回答ですみませんでした;


13:[完了] hide [2007/03/06 22:52 ]

ありがとうございました!

print("location.replace = 'top.html';");

print("location.href = 'top.html';");

ようやく意味が分り、上記の修正を加えましたら希望の動作になりました。
要領が悪くで済みませんでした。
感謝です。


[戻る]