PHPでのPCアクセス制限方法

このQ&Aのポイント
  • PHPを使用してPCのアクセス制限を行う方法について説明します。
  • PCと携帯を振り分けて同じURLで別々の画面を表示する方法も紹介します。
  • Sleipnirなどのソフトウェアを使用しても閲覧ができないようにするためのPHPスクリプトを提供します。
回答を見る
  • ベストアンサー

PHP PCアクセス制限

PHPでの、PCアクセス制限です。 僕が運営しているサイトは、 PCでも閲覧が可能ですが、掲示板などの書込・閲覧は禁止しています。 <?php $ua = $_SERVER["HTTP_USER_AGENT"]; if(ereg("UP\.Browser|KDDI|DoCoMo|J-PHONE|Vodafone|SoftBank|MOT-|L-mode|DDIPOCKET|WILLCOM|PDXGW|ASTEL", $ua)){ print "携帯"; exit; } elseif(ereg("Opera|ibisBrowser",$ua) && !(ereg("(Win|Mac|Linux|FreeBSD|Solaris)", $ua))){ print "携帯"; exit; } else{ print "PC"; exit; } ?> で、PCと携帯を振り分けて、同じURLで、 別々の画面を表示します。 ですが、「Sleipnir」等の、ソフトウェアを使用すると、 携帯画面が表示できてしまいます。 ソフトウェアを使用しても閲覧が出来ないよう、 PHPで、他にいい方法はありませんか? 「.htaccess」だと、全体を禁止する事になってしまうので… PHPスクリプトで、お願いします。

  • PHP
  • 回答数4
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • warez
  • ベストアンサー率57% (29/50)
回答No.1

IP アドレスで弾くのがベストではないでしょうか。 IPアドレスで携帯を振り分ける方法 http://d.hatena.ne.jp/toku-hiro/20080913

natto048
質問者

補足

DoCoMoに続いて、au、SoftBankのIPを追加しました。 <?php if (isDoCoMoIP()) { } if (isAuIP()) { } if (isSoftBankIP()) { } function isDoCoMoIP() { require_once 'Net/IPv4.php';// PEAR Net_IPv4 //DoCoMo のIP帯域をセット $ip_list = array( '210.153.84.0/24', '210.136.161.0/24', '210.153.86.0/24', '124.146.174.0/24', '124.146.175.0/24' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "DoCoMo"; return true; } } function iAuIP() { require_once 'Net/IPv4.php';// PEAR Net_IPv4 // au のIP帯域をセット $ip_list = array( '210.230.128.224/28', '121.111.227.160/27', '61.117.1.0/28', '219.108.158.0/27', '219.125.146.0/28', '61.117.2.32/29', '61.117.2.40/29', '219.108.158.40/29', '219.125.148.0/25', '222.5.63.0/25', '222.5.63.128/25', '222.5.62.128/25', '59.135.38.128/25', '219.108.157.0/25', '219.125.145.0/25', '121.111.231.0/25', '121.111.227.0/25', '118.152.214.192/26', '118.159.131.0/25', '118.159.133.0/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "au"; return true; } } function isSoftBankIP() { require_once 'Net/IPv4.php';// PEAR Net_IPv4 //SoftBank のIP帯域をセット $ip_list = array( '123.108.236.0/24', '123.108.237.0/27', '202.179.204.0/24', '202.253.96.224/27', '210.146.7.192/26', '210.146.60.192/26', '210.151.9.128/26', '210.169.130.112/28', '210.175.1.128/25', '210.228.189.0/24', '211.8.159.128/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "SoftBank"; return true; } } return false; } print "PC"; ?> これでも、「85番目」が、エラーになってしまいます。

その他の回答 (3)

回答No.4

function なにがし {  foreach (なにがし) {   if (なにがし) {   }  } << ここに functionの閉じる }がない ということです。 計3箇所。

natto048
質問者

補足

ありがとうございます。 以下のような感じでOKなのでしょうか? 今度は、 Parse error: syntax error, unexpected $end in /index.php on line 89 「89」番目がエラーになっているようですが? <?php if (isDoCoMoIP()) { } if (isAuIP()) { } if (isSoftBankIP()) { } function isDoCoMoIP(){ { require_once 'Net/IPv4.php';// PEAR Net_IPv4 //DoCoMo のIP帯域をセット $ip_list = array( '210.153.84.0/24', '210.136.161.0/24', '210.153.86.0/24', '124.146.174.0/24', '124.146.175.0/24' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "DoCoMo"; return true; } } } function isAuIP(){ { require_once 'Net/IPv4.php';// PEAR Net_IPv4 // au のIP帯域をセット $ip_list = array( '210.230.128.224/28', '121.111.227.160/27', '61.117.1.0/28', '219.108.158.0/27', '219.125.146.0/28', '61.117.2.32/29', '61.117.2.40/29', '219.108.158.40/29', '219.125.148.0/25', '222.5.63.0/25', '222.5.63.128/25', '222.5.62.128/25', '59.135.38.128/25', '219.108.157.0/25', '219.125.145.0/25', '121.111.231.0/25', '121.111.227.0/25', '118.152.214.192/26', '118.159.131.0/25', '118.159.133.0/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "au"; return true; } } } function isSoftBankIP(){ { require_once 'Net/IPv4.php';// PEAR Net_IPv4 //SoftBank のIP帯域をセット $ip_list = array( '123.108.236.0/24', '123.108.237.0/27', '202.179.204.0/24', '202.253.96.224/27', '210.146.7.192/26', '210.146.60.192/26', '210.151.9.128/26', '210.169.130.112/28', '210.175.1.128/25', '210.228.189.0/24', '211.8.159.128/25' ); foreach ($ip_list as $ip) { if (Net_IPv4::ipInNetwork($_SERVER['REMOTE_ADDR'], $ip)) { print "SoftBank"; return true; } } } return false; } print "PC"; ?>

回答No.3

各functionの { に対応する }がないようです。

natto048
質問者

補足

ありがとうございます。 「{ に対応する }がない」とは、何ですか? すみません。PHP初心者(勉強不足)で、よく分かりません。 その為、どう修正していいのか分からず、困っています。 どなたか、お願いします!

  • memphis
  • ベストアンサー率40% (975/2395)
回答No.2

USER_AGENTは偽装できるならIPで確認するのが確実です。 そのスクリプトでエラーになるのは、処理名が間違っているからです。 あと、WILLCOMもチェックしたほうがいいです。

natto048
質問者

補足

ありがとうございます。 処理名が「function isAuIP()」のはずが、「function iAuIP()」に間違っていました。 それでも、エラーが出たままです。 Parse error: syntax error, unexpected $end in /index.php on line 85 WILLCOM(ウィルコム?)も後ほど追加します。 上記のエラーコードは、どんな処理の失敗(エラー)何ですか?

関連するQ&A

  • Flash Lightで作成したswfを携帯で表示したいです。

    FlashCS3を使用しPCと同URLで携帯サイトを作成しています。 振り分けに「index.php」を使用し、 携帯用 m_index.html PC用 pc_index.html として「m_index.html」からFlash Light 1.1でパブリッシュした swfファイルを携帯で表示させたいと思っています。 テストでDreamweaver内にテキストのみ入れた 「m_index.html」は共通URLから携帯表示できました。 そこでPCと同様にDreamweaverでswfを配置したhtmlを 「m_index.html」としても携帯ではエラー表示が出てしまいました。 お恥ずかしながらPCと同じに考えてはいけないのかもしれませんが、 ここからどうすれば作成したswfを 「m_index.html」で表示出来るのか教えていただければと思い、 質問させていただきました。 それ自体は可能なのでしょうか? PC環境はMacOS10.4.11でFlashCS3を使用しています。 トップページとして作成しているSwfでは画像と6つのボタン 1つは別サイトへのリンクボタン、 それ以外は別で作成したswfファイルをリンクしたいと思っています。 分かる方がいらしたらぜひ教えていただければと思います。 よろしくお願いいたします。 ※phpファイル内の記述 <?php /* ------------------------------------------- Crossindex PHP版 Ver.1.1 XTREC エクストレック Copyright (C) 2005-2007 XTREC All Rights Reserved. http://www.xtrec.com/ ---------------------------------------------*/ $pc_web ="pc_index.html"; $m_web = "m_index.html"; $ua = $_SERVER["HTTP_USER_AGENT"]; if(ereg("UP\.Browser|KDDI|DoCoMo|J-PHONE|Vodafone|SoftBank|MOT-|L-mode|DDIPOCKET|WILLCOM|PDXGW|ASTEL", $ua)){ header("Location:".$m_web); exit; } elseif(ereg("Opera|ibisBrowser",$ua) && !(ereg("(Win|Mac|Linux|FreeBSD|Solaris)", $ua))){ header("Location:".$m_web); exit; } else { header("Location:".$pc_web); exit; } ?>

  • 携帯サイトでPC版yahooクローラー以外をアクセス制限するには?

    現在携帯サイトを運営しているのですが、 パソコンで閲覧した際に、閲覧できないようにPHPで設定しています。 ですが、そうするとPC版のyahooやgoogleのクローラーがアクセスできないと思うのですが、パソコンでアクセスできなくして、なおかつクローラーはアクセスできるようにするにはどうすればいいでしょうか? ちなみに現在は下記のように設定してます。 <?php $user_agent = $_SERVER["HTTP_USER_AGENT"]; if(ereg("(MSIE|Mozilla)",$user_agent)){ header("Location: PCで閲覧したときのフォルダ"); exit; }

    • ベストアンサー
    • PHP
  • PHPでのガラケー、PC、iPhone振り分け

    レッツPHPさんの写メールBBSを使用しています。 iPhoneページを作成し、mailbbs.phpで振り分け設定を試みたのですが どれだけやってもどうにも上手くいきません。 スマートフォンのページ名をmailbbs_smart.htmlとし、 (他のPC用、携帯用ではデフォルトでmailbbs_pc.html、mailbbs_i.htmlとなっていました) 振り分け設定では mailbbs.phpに $ua = explode("/", $_SERVER['HTTP_USER_AGENT']); if (strstr($ua[0], "DoCoMo")) { $env = "i"; // DoCoMo } elseif (preg_match("#^UP.Browser|KDDI#i", $ua[0])) { $env = "i"; // au } elseif (preg_match("#^J-PHONE|Vodafone|SoftBank|MOT#i", $ua[0])) { $env = "i"; // Vodafone } elseif (preg_match($ua[0] , "iPhone")) { $env = "smart"; //iPhone } と記述しました。 他にeregなどでも設定したのですが大抵 ・ページが表示されない か ・PC用のデザインで表示される という風になってしまいます。 htmltamplate.incとの関連付けが上手くいってないからでしょうか。 当方PHPに関してあまり詳しくありません。 レッツPHPさんの写メールBBSを使用した方いましたら、 是非ご教授お願いします。 レッツPHPさんのHP http://php.s3.to/bbs/bbs7.php

    • 締切済み
    • PHP
  • PHPのソース内でのVodafone絵文字の扱い方

    PHPで、DoCoMo,Vodafone,auの3機種の絵文字を出し分けるファンクションを書いていました。 function emoji($imode,$vodafone,$ez){ $ua = $_SERVER["HTTP_USER_AGENT"]; if(ereg("DoCoMo",$ua)){ print $imode; }else if(ereg("J-PHONE",$ua)){ print $vodafone; }else if(ereg("Vodafone",$ua)){ print $vodafone; }else if(ereg("UP.Browser",$ua)){ print "<IMG LOCALSRC=".$ez." />"; } } というファンクションを定義し、 <?php emoji(ドコモの絵文字,Vodafoneの絵文字,EZの絵文字番号); ?> と書けば、アクセスしたキャリアによって絵文字を出し分けるしくみです。 しかし、Vodafoneの絵文字のコードが特殊なため、エラーになってしまいます。 $記号が含まれているせいかな?と思って $の前に\を入れてみたりもしましたが、ダメでした。 何かよい回避方法はありますでしょうか?

    • ベストアンサー
    • PHP
  • UAによって表示リンクを変える

    携帯とPCでアクセスした場合に、ローテーションで表示されるバナーを変えたいと思っているのですが、どうしてもエラーになります。PHPはかなり初心者ですが、どなたか手助けをお願い致します。 ▼例 こんな感じにしていますがエラーになります。 <? $ua = $_SERVER["HTTP_USER_AGENT"]; if(ereg("DoCoMo",$ua)){ print "<?php include"http://server.com/ad_mobile.php";?>"; }else{ print "<?php include"http://server.com/ad_pc.php;?>"; }?>

    • ベストアンサー
    • PHP
  • 携帯端末振り分けソースがソフトバンク端末でうまくいかない?

    携帯端末振り分けの以下のソースを利用していますが、ソフトバンクからフリーで配布されている「ウェブコンテンツビューア」というシュミレータを使いテストするとtype1~3いずれもデスクトップと判断されてしまいます。 「ウェブコンテンツビューア」は何か設定が必要なのでしょうか?、それともこれらのソースにはソフトバンク端末に対するソースのミスがあるのでしょうか? #type1 if($ua=~ /DoCoMo/){$user_agent = 'mobile';} elsif($ua=~ /J-PHONE\/2/){$user_agent = 'mobile';} elsif($ua=~ /J-PHONE\/[3-9]/){$user_agent = 'mobile';} elsif($ua=~ /Vodafone/){$user_agent = 'mobile';} elsif($ua=~ /SoftBank/){$user_agent = 'mobile';} elsif($ua=~ /ASTEL/){$user_agent = 'mobile';} elsif(index($ua,"UP.Browser")==0){$user_agent = 'mobile';} elsif(index($ua,"UP.Browser") > 0){$user_agent = 'mobile';} else{$user_agent = 'desktop';}#Mac and PC #type2 if($ua =~ /^(DoCoMo\/1)/i){$user_agent = 'mobile';}#DoCoMo elsif($ua =~ /^(DoCoMo\/2)/i){$user_agent = 'mobile';}#DoCoMo_FOMA elsif($ua =~ /^ASTEL/i){$user_agent = 'mobile';}#ASTEL elsif($ua =~ /^J\-PHONE/i){$user_agent = 'mobile';}#softbank elsif($ua =~ /^Vodafone/i){$user_agent = 'mobile';}#softbank elsif($ua =~ /^SoftBank/i){$user_agent = 'mobile';}#softbank elsif($ua =~ /^KDDI/i){$user_agent = 'mobile';}#au elsif($ua =~ /^UP\.Browser/i){$user_agent = 'mobile';}#au else{$user_agent = 'desktop';}#Mac and PC #type3 if ($ua =~ /DoCoMo|J-PHONE|Vodafone|Softbank|MOT-|L-mode|DDIPOCKET|PDXGW|ASTEL/ ) { $user_agent = 'mobile'; } else{$user_agent = 'desktop';}

    • ベストアンサー
    • Perl
  • phpのユーザーエージェントでの振り分け方法

    phpのユーザーエージェントでの振り分け方法 質問お願いします。 phpのユーザーエージェントでの振り分け方法を調べまして $ua = $_SERVER['HTTP_USER_AGENT']; if ((strpos($ua, 'Android') !== false) && (strpos($ua, 'Mobile') !== false) || (strpos($ua, 'iPhone') !== false) || (strpos($ua, 'Windows Phone') !== false)) { // スマートフォンからアクセスされた場合 header("Location: smartphone/index.html"); exit(); } elseif ((strpos($ua, 'Android') !== false) || (strpos($ua, 'iPad') !== false)) { // タブレットからアクセスされた場合 header("Location: tablet/index.html"); exit(); } elseif ((strpos($ua, 'DoCoMo') !== false) || (strpos($ua, 'KDDI') !== false) || (strpos($ua, 'SoftBank') !== false) || (strpos($ua, 'Vodafone') !== false) || (strpos($ua, 'J-PHONE') !== false)) { // 携帯からアクセスされた場合 header("Location: mobile/index.html"); exit(); } else { // その他(PC)からアクセスされた場合 header("Location: pc/index.html"); exit(); } とコピペで記入してスマホなどを振り分けています。 safari6とsafari7で見た時だけ header("Location: tablet/index.html"); に振り分けたいのですが、どうしたらよいでしょうか? 素人ですいません。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 【PHP・.htaccess】PCと携帯の振り分けについて

    【PHP・.htaccess】PCと携帯の振り分けについて お世話になります。 PHP・.htaccess共に初心者なのですが、 PCサイトと携帯サイトの振り分けで悩んでいるので宜しくお願い致します。 現在の構成が http://sample.com/ ←トップページ(PHPファイルのみ。各トップへ振り分け) http://sample.com/pc/ ←PCトップページ http://sample.com/mo/ ←モバイルトップページ(.htaccessでIP制限。PCからのアクセスはトップへ) ---------------------------------------------------- 振り分けPHP(http://sample.com/) <?php $agent = $_SERVER['HTTP_USER_AGENT']; if(preg_match("/^DoCoMo/i", $agent)){ header("Location: http://sample/mo/"); exit; }else if(preg_match("/^(J-PHONE|Vodafone|MOT-[CV]|SoftBank)/i", $agent)){ header("Location: http://sample/mo/"); exit; }else if(preg_match("/^KDDI-/i", $agent) || preg_match("/UP.Browser/i", $agent)){ header("Location: http://sample/mo/"); exit; }else{ header("Location: http://sample/pc/"); exit; } ---------------------------------------------------- となって居ますが、都合により http://sample.com/ ←PCトップ モバイルからのアクセスはmoに振り分け。 http://sample.com/mo/ ←モバイルトップページ。(.htaccessでIP制限。PCからのアクセスはトップへ) 上記の形に切り替えたいと思っています、 PHPを使って振り分けをしたいと思っているのですが、 上記の形を再現する事は出来ますでしょうか? また、.htaccessを利用する事により解決が出来るのであれば、 そちらもご教授いただけると幸いです。

    • 締切済み
    • PHP
  • ベーシック認証を使ったパソコンのアクセス制限

    ある携帯サイトをパソコンから閲覧すると ベーシック認証の画面が出てきます。 ユーザーエージェントを偽装しても 同様にベーシック認証が求められ パソコンからはどうしても閲覧できないようになっています。 携帯電話からは、ベーシック認証は行なわれず ふつうに閲覧することができました。 わたしもおなじようなベーシック認証を行ないたいと思い 検索しましたが、どうしても見つからなかったので 今回質問をいたしました。 おそらく.htaccessのhtpasswdやphpを用いているのだと思うのですが どのようにして実現しているのでしょうか? スクリプトなどを公開しているサイトなどがございましたら お教えいただけませんでしょうか?

    • ベストアンサー
    • HTML
  • PHPで携帯・PC振り分け

    PCサイトと携帯サイトを作りました。 同じURLで、それぞれからアクセスした場合に 最適のページが表示されるようにしたいと思います。 phpを利用したいのですが、 どこに埋め込んでよいのかわかりません。 PCのトップページはindex.phpなのですが、 このページの1行目から振り分けのphpソースを書き込んだのですが、間違ってるでしょうか? http://www.marguerite.to/Nihongo/Labo/PHP4Mobile/PageDistribution.html ↑これをURLだけ書き変えれば使えると思ったのですが、大きな間違いを犯してますでしょうか? どこに設置すればよいのでしょうか。 動作結果は、PCから閲覧した場合に ずっと「ページを読み込んでいます」と表示されて 真っ白なままになります。 携帯からはスムーズにアクセスでき、きちんと携帯用ページが表示されました。 よろしくお願いしますm(_ _)m

    • 締切済み
    • PHP

専門家に質問してみよう