プロが教える店舗&オフィスのセキュリティ対策術

THE ROOMさんの「ranklink」を使って、携帯用のランキングサイトを
公開しているのですが、投票(voteform)ページを、携帯端末からのアク
セスの時のみ表示して、その他PC等からのアクセス時には非表示
(そのままランキングページを表示)になるようにしたいのですが、何か
良い方法は無いでしょうか。。。

すごく抽象的な尋ね方ですみません。
詳しい方、アドバイスお願いします。。。

A 回答 (4件)

if (($host !~ /\.docomo\.ne\.jp$/i) && ($host !~ /\.jp-[cdhknqrst]\.ne\.jp$/i) && ($host !~ /\.ezweb\.ne\.jp$/i)){


print "Location: http://www.goo.ne.jp/\n\n";
}
としてみたらいかがでしょう?
これで正常に動くと思うのですが、動作確認してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます!

omni2さんのおかげで完全解決しました!
お手数かけました。

ありがとうございます。

お礼日時:2005/03/28 08:33

昨日書いたのはやめにして、



if ($id ne ""){ 

となってる所に、次を追加してください。(ちょっと長くて無理やりな感じの記述ですが許してください。)
##########################################################################
my ($flag_1,$flag_2) = (0,0);
my ($flag_3,$flag_4,$flag_5,$flag_6,$flag_7,$flag_8,$flag_9,$flag_10,$flag_11) = (0,0,0,0,0,0,0,0,0);
my ($flag_12,$flag_13,$flag_14,$flag_15,$flag_16,$flag_17,$flag_18,$flag_19,$flag_20) = (0,0,0,0,0,0,0,0,0);
my ($flag_21,$flag_22,$flag_23,$flag_24,$flag_25,$flag_26,$flag_27,$flag_28,$flag_29,$flag_30,$flag_31,$flag_32) = (0,0,0,0,0,0,0,0,0,0,0,0);

# Docomo - ip #
foreach my $t_ip(0..255){
if( $ip eq "210.153.84.$t_ip" ){$flag_1 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "210.136.161.$t_ip" ){$flag_2 = 1;break;}
}

# Vodafone -ip #
foreach my $t_ip(32..63){
if( $ip eq "210.134.83.$t_ip" ){$flag_3 = 1;break;}
}

foreach my $t_ip(192..255){
if( $ip eq "210.146.7.$t_ip" ){$flag_4 = 1;break;}
}
foreach my $t_ip(128..255){
if( $ip eq "210.146.60.$t_ip" ){$flag_5 = 1;break;}
}
foreach my $t_ip(160..191){
if( $ip eq "210.151.9.$t_ip" ){$flag_6 = 1;break;}
}
foreach my $t_ip(192..255){
if( $ip eq "210.169.193.$t_ip" ){$flag_7 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "210.228.189.$t_ip" ){$flag_8 = 1;break;}
}
foreach my $t_ip(160..191){
if( $ip eq "210.8.49.$t_ip" ){$flag_9 = 1;break;}
}
foreach my $t_ip(128..255){
if( $ip eq "210.8.159.$t_ip" ){$flag_10 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "211.127.183.$t_ip" ){$flag_11 = 1;break;}
}

# EZweb - ip #
foreach my $t_ip(0..255){
if( $ip eq "210.169.40.$t_ip" ){$flag_12 = 1;break;}
}
foreach my $t_ip(192..255){
if( $ip eq "210.196.3.$t_ip" ){$flag_13 = 1;break;}
}
foreach my $t_ip(192..255){
if( $ip eq "210.196.5.$t_ip" ){$flag_14 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "210.230.128.$t_ip" ){$flag_15 = 1;break;}
}
foreach my $t_ip(192..255){
if( $ip eq "210.230.141.$t_ip" ){$flag_16 = 1;break;}
}
foreach my $t_ip(32..39){
if( $ip eq "210.234.105.$t_ip" ){$flag_17 = 1;break;}
}
foreach my $t_ip(64..127){
if( $ip eq "210.234.108.$t_ip" ){$flag_18 = 1;break;}
}
foreach my $t_ip(192..255){
if( $ip eq "210.251.1.$t_ip" ){$flag_19 = 1;break;}
}
foreach my $t_ip(0..31){
if( $ip eq "210.251.2.$t_ip" ){$flag_20 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "211.5.1.$t_ip" ){$flag_21 = 1;break;}
}
foreach my $t_ip(128..255){
if( $ip eq "211.5.2.$t_ip" ){$flag_22 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "211.5.7.$t_ip" ){$flag_23 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "218.222.1.$t_ip" ){$flag_24 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "61.117.0.$t_ip" ){$flag_25 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "61.117.1.$t_ip" ){$flag_26 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "61.117.2.$t_ip" ){$flag_27 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "61.202.3.$t_ip" ){$flag_28 = 1;break;}
}
foreach my $t_ip(0..63){
if( $ip eq "219.108.158.$t_ip" ){$flag_29 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "219.125.148.$t_ip" ){$flag_30 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "222.5.63.$t_ip" ){$flag_31 = 1;break;}
}
foreach my $t_ip(0..255){
if( $ip eq "222.7.56.$t_ip" ){$flag_32 = 1;break;}
}
if( !$flag_1 && !$flag_2 && !$flag_3 && !$flag_4 && !$flag_5 && !$flag_6 && !$flag_7 && !$flag_8 && !$flag_9 && !$flag_10 && !$flag_11 &&
!$flag_12 && !$flag_13 && !$flag_14 && !$flag_15 && !$flag_16 && !$flag_17 && !$flag_18 && !$flag_19 && !$flag_20 &&
!$flag_21 && !$flag_22 && !$flag_23 && !$flag_24 && !$flag_25 && !$flag_26 && !$flag_28 && !$flag_29 && !$flag_30 &&
!$flag_31 && !$flag_32){
print "Location: $abshtmldir/index.$outputfile\n\n";
}

#############################################################################

これで、ipによる振り分けはできると思います。
ただし、ip帯域については確認していませんし、記述が間違ってるかもしれませんので、ご確認ください。

hostによる振り分けは、
Docomoの場合、docomo.ne.jpがはいると思うので(必ず入るかどうかは未確認)

if( $host !~ /docomo.ne.jp$/i ){print "Location: $abshtmldir/index.$outputfile\n\n";}

これを、
if ($id ne ""){
 の後に、記述すればOKかと思うのですが。(未確認)

VodafoneやEzwebのhost名はわかりませんので、各携帯会社に御問い合わせください。
もしくは、おしえてGooで「各携帯のhost名をおしえて」という質問で誰かに教えてもらってください。


#######################################################################
別の方法としてUserAgentによる振り分けもあります。
UserAgent はアクセスしてくれた携帯のブラウザの種類です。
Docomoの携帯からのアクセスならアクセスしたブラウザの種類にDoCoMoという文字が必ずはいります。
Vodafoneの携帯からのアクセスならアクセスしたブラウザの種類にJ-PHONEという文字が必ずはいります。
AUの携帯からのアクセスならアクセスしたブラウザの種類にKDDIという文字が必ずはいります。
ツーカーはよくわかりませんが、UP.Browserでいいとおもいます。

my $useragent = $ENV{'HTTP_USER_AGENT'};
my $flag = 0;
if( $useragent =~ /DoCoMo|J-PHONE|KDDI|UP.Browser/i ){$flag = 1;}
if( !$flag ){print "Location: $abshtmldir/index.$outputfile\n\n";}


これを、
if ($id ne ""){
 の後に、記述すればOKかと思います。
#######################################################################

■携帯各社UserAgent情報のページ
●Docomo-UserAgent
http://www.nttdocomo.co.jp/p_s/imode/make/spec/i …
●Vodafone-UserAgent
http://developers.vodafone.jp/dp/tool_dl/web/use …
●Ezweb-UserAgent
http://www.au.kddi.com/ezfactory/tec/spec/4_4.html

いろいろ方法がありますが、
ipによる振り分け--ip帯域が増えたり減ったりする可能性がある。
hostによる振り分け-- 問い合わせたDNSがまちがった値を吐き出す可能性もある。
useragentによる振り分け--DoCoMoやJ-PhoneといったUserAgentoを吐き出すブラウザを作ってPCからアクセスされる可能性も十分ある。

といろいろ問題がありますので、ご自分の判断で好きなものをお使いください。
    • good
    • 0
この回答へのお礼

>hostによる振り分けは、
>Docomoの場合、docomo.ne.jpがはいると思うので(必ず入るかどうかは未確認)
>
>if( $host !~ /docomo.ne.jp$/i ){print "Location: $abshtmldir/index.$outputfile\n\n";}
>
>これを、
>if ($id ne ""){
> の後に、記述すればOKかと思うのですが。(未確認)
>
>VodafoneやEzwebのhost名はわかりませんので、各携帯会社に御問い合わせください。

やりたい事はまさにこれです!

if( $host !~ /\.docomo\.ne\.jp$/){print "Location: http://www.goo.ne.jp/\n\n";}

これを指定箇所に挿入すると、HOST名選別ができました!
inカウントも正常にカウントされていましたし、動作も問題ありません
でした。
上記内容を挿入した場合、ドコモユーザーのみvoteformページへ飛び、
その他のホスト名のユーザーはLocationで指定したgoo.ne.jpに飛び
ました。

ただ、一点だけ、問題が残りました…
上記の様に、指定するホスト名が1つだけなら良いのですが、ホスト名を
複数指定すると、動作がおかしくなるんです。
例えば、
「ドコモ、旧Jフォン、ezwebのみvoteformページへ飛び、その他のホスト名のユーザーはLocationで指定したgoo.ne.jpに飛ばす」

if (($host !~ /\.docomo\.ne\.jp$/) ||($host !~ /\.jp-[hdtckrnqs]\.ne\.jp$/) ||($host !~ /\.ezweb\.ne\.jp$/)){print "Location: http://www.goo.ne.jp/\n\n";}

これだと、ドコモでも何でも関係なくLocationで指定したページに飛び
ます…
Locationしか効いていないみたいなんです。。。

if ($host !~ /\.docomo\.ne\.jp$/){print "Location: http://www.goo.ne.jp/\n\n";}
if ($host !~ /\.jp-[hdtckrnqs]\.ne\.jp$/){print "Location: http://www.goo.ne.jp/\n\n";}
if ($host !~ /\.ezweb\.ne\.jp$/){print "Location: http://www.goo.ne.jp/\n\n";}

これでも結果は同じです。。。

あと一歩というところまで来てる気がするのですが。。。
すみません引き続きアドバイスお願いします。。。

お礼日時:2005/03/25 20:54

ranklink.cgiファイルの中に、


if( $id ne ""){

if (!-e "$datadir/$id.dat"){
&error("ID:$idは登録されていません。");
}
if (&filelock(1)){
open (IN,"+<$rankfile");
eval{flock(IN,2)};
$a1=<IN>;$a1=<IN>;@rankset=split(/<>/,scalar(<IN>));
close(IN);
&rankin;
}
}

となっているところがあると思いますので探してください。
それを、次のように、変えてください。

if ($id ne ""){
### この下3行だけ付け足すだけ、あとは変えない ###
if( $ip ne "210.153.84.0" ){
print "Location: $abshtmldir/index.$outputfile\n\n";
exit;
}
##################################################

if (!-e "$datadir/$id.dat"){
&error("ID:$idは登録されていません。");
}
if (&filelock(1)){
open (IN,"+<$rankfile");
eval{flock(IN,2)};
$a1=<IN>;$a1=<IN>;@rankset=split(/<>/,scalar(<IN>));
close(IN);
&rankin;
}
}

PCからアクセスして、http://○○○/ranking.cgi?id=○○○○でアクセスしてためしてください。
voteformページが表示されなくなるとおもいます。

210.153.84.0はDocomoのipアドレスの一部です。
Docomoのipアドレス帯域は、
210.153.84.0/24
210.136.161.0/24
なので、このipアドレス以外は指定ページに飛ばすようにすればいいと思います。
具体的には
210.153.84.0/24 は 210.153.84.0 ~ 210.153.84.255
210.136.161.0/24 は 210.136.161.0 ~ 210.136.161.255
なので、
if( $ip ne "210.153.84.0" && $ip ne "210.153.84.1" && ~ && $ip ne "210.153.84.255"
&& $ip ne "210.136.161.0 && ~ && $ip ne "210.136.161.255){
print "Location ~";
exit;
}
と書けばいいとおもいます。

ただし、$ip ne "210.153.84.0"のようにだらだらと書いていくのはしんどいので、
テキストにDocomoとVodafoneとEZwebのアドレスを書いておいて、
サブルーチン化して、テキストファイルの中にあるipアドレスと同じなら1を返すなどとしておけば
いいと思います。

■ipアドレスについては、先日書いた、htaccessのページに詳しく書いてあります。
http://mikeneko.creator.club.ne.jp/~lab/web/htac …

■各携帯のip帯域の書いたページは以下になります。
●iモードセンターのIPアドレス
http://www.nttdocomo.co.jp/p_s/imode/make/ip/ind …
●VodafoneのIPアドレス
http://developers.vodafone.jp/dp/tech_svc/web/ip …
●EZwebのIPアドレス
http://www.au.kddi.com/ezfactory/tec/spec/ezsava …
    • good
    • 0
この回答へのお礼

ありがとうございます。。。

教えていただいた通りに記述してみたのですが、cgiエラーが出ます。

if( $ip ne "210.153.84.0" && $ip ne "210.153.84.1" && ~ && $ip ne "210.153.84.255"
&& $ip ne "210.136.161.0 && ~ && $ip ne "210.136.161.255){
print "Location http://www.goo.ne.jp\n\n";
exit;
}

(※ 上をif ($id ne ""){ 直下に挿入)
210.136.161.0と210.136.161.255の直後の「"」が抜けていたので付け足
して試してみましたが、結果は同じでした。
ちなみに、

if( $ip ne "210.153.84.0" ){
print "Location: $abshtmldir/index.$outputfile\n\n";
exit;
}

一番最初に示していただいた例のip部を自分のipに変えて試してみたら
ipに何を指定しても、Locationで指定したurlに飛びます。。。
Locationだけ効いている様です。。。

何がいけないのでしょうか。。。
お手数掛けますがアドバイス、お願いします。。。

もう一点、できればip指定では無くHOST名による振り分けができれば…
と思っています。
ipは各キャリア不定期に追加され、チェック漏れが出る可能性があります
ので。
特にボーダフォン等は、確実にip増えているのに公式サイトの情報は2年
前から放置されていますし。。。

引き続きアドバイス、お願いします。

お礼日時:2005/03/25 03:50

私も詳しくないのでアドバイスですが、


voteformページはHTMLファイルですよね。
PC等からのアクセスはそのHTMLファイル自体を表示したくないということでよろしいのでしょうか?

でしたら、サーバの.htaccessの設定(サーバがApacheの場合ですが。。)で、携帯のipアドレスのみ通過させればいいような気がします。
.htaccessの参考ページはこちら。
http://mikeneko.creator.club.ne.jp/~lab/web/htac …
このページにはi-modoやvodafoneのみ通過させる方法まで記述されてますので、一読してみてください。

ただし、レンタルサーバなどをお使いもしくの場合は、.htaccessファイルの使用を許可していない所もたくさんあるので、管理者に確認してみてください。

その場合は、voteformページは表示させるが、その先のページには進めないようにCGIでperlで書かなければ無理のようなきがします。
たとえば、rl_prf.cgiファイルってありますよね。
その中の中ほどに「#ここまでの設定部分」って書いてますが、(探してください)その下に、$ipと$hostって変数がありますよね。ですから、携帯の$ip意外では他のページに飛ぶ処理とかをこのへんでかいてやればいいのではないでしょうか。ちょっと、工夫が必要ですけど。

はずしてたらすみません。

参考URL:http://mikeneko.creator.club.ne.jp/~lab/web/htac …
    • good
    • 0
この回答へのお礼

アドバイス、ありがとうございます。。。

.htaccessでhtmlフォルダ内を携帯端末以外非表示にする処理を
行ってみたのですが、voteformページ自体は、.htaccessでそう
いった処理をしても関係無く、
ranklink.cgi?id=○○○
という形でvoteformページの内容が呼び出され、表示されてしま
います。
では、ranklink.cgiを含むそれ以下のファイルも.htaccessで携帯
端末以外非表示に… とやると、ランキングページ自体全て携帯
端末以外は見れなくなってしまいます。。。

色々調べてみて、ranklink.cgiの100行目あたり

if ($a1){
&fileunlock;
&changehtml("voteform","id","ssd");
}
}

このあたりの、"voteform"の部分を"index"等に変えると、投票ページ
として読み出すページが変えれるところまでは分かったのですが。。。

ここより少し前に
(gethostbyaddr(pack('C4', split(/\./, $ENV{'REMOTE_ADDR'})
(($a1 =~ /\.docomo\.ne\.jp$/) ||($a1 =~ /\.jp-[hdtckrnqs]\.ne\.jp$/) ||($a1 =~ /\.ezweb\.ne\.jp$/))
みたいな感じでホスト名取得して、携帯以外のHOSTを持つアクセスに
関しては指定のページに飛ばす…
みたいに書けばいいのかなとは思うのですが、どう書いたらいいのか。。。

引き続き、アドバイスお願いします。。。

お礼日時:2005/03/23 17:49

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