phpでipアドレスによる処理分岐する方法とその書き方について

このQ&Aのポイント
  • phpでipアドレスによる処理分岐をする方法とその書き方について説明します。また、3つのパターンについても比較しています。
  • パターンAとBの処理速度や、マッチしなかった場合の分岐の書き方について解説します。
  • パターンCの問題点や他の書き方について考察し、オススメの処理分岐方法について紹介します。
回答を見る
  • ベストアンサー

phpにて、ipアドレスによる処理分岐をする場合について

スクリプト設置環境 ・php4 or php5 環境情報がザックリな書き方で問題がありましたら、補足させて頂きますので、その場合にはご忠告下さい。 今回、ipアドレスによる処理分岐を考えていますが、しようとしていることは、 「サイト管理者のアクセスカウントをしないようにしたい」 ということです。 つまり、アクセス者のIPがサイト管理者のIPと一致した場合には、 アクセスカウントをしないような分岐コードを書きたいわけです。 以下、3パターンを考えましたので、それをもとに質問をします。 よろしくお願い致します。 ///////////////////////////////////////////// $ip = $_SERVER['REMOTE_ADDR']; //サイト管理者のIPアドレス:「xxx.xxx.x.xxx」とする。 //パターン:(A):preg_match による方法 if(preg_match("/xxx.xxx.x.xxx/",$ip)==0){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 } //パターン:(B):ereg による方法 if(ereg("xxx.xxx.x.xxx",$ip)==0){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 } //パターン:(C):問題ありな書き方 if($ip !== "xxx.xxx.x.xxx"){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 } ///////////////////////////////////////////// と、3パターンの方法を考えてみました。 質問は下記の(1)~(4)の4つです。 回答できるもののみの回答でも結構ですので、どうぞよろしくお願い致します。 (1)パターンAとBでは、どちらの方が処理が速いですか。 (2)パターンAまたはBにおいて、マッチしなかった場合の分岐の書き方を「==0」としていますが、「!」を使った方法など、他の書き方もありますか。 ※「==0」→「==0」(念のため、見やすく書きますと。) (3)パターンCは、不思議と正常に機能しない場合があるのですが、それはなぜでしょうか。あるファイルでは、このパターンCでも機能するのですが、別のファイルになると、この書き方では機能しないことがあります。それがとても不思議でなりません。また、こういった書き方(作法)は一般的に良くないのでしょうか。良くない明確な理由がありましたら教えて頂けると嬉しいです。 (4)上記の3パターン以外にも「ipアドレスによる処理分岐」の書き方はあるかと思いますが、オススメのものがありましたら教えて下さい。もし無い場合は、上記3パターンではどれがベストか教えて頂けると嬉しいです。 視点として、処理の確実性・安全性(バイナリセーフなどを意識)、処理速度(ページビュー快適性)を考慮して頂ければと思います。他に重要な視点がありましたら、そちらも併せて考慮して頂けると助かります。 以上、よろしくお願い致します。

  • march4
  • お礼率83% (628/754)
  • PHP
  • 回答数5
  • ありがとう数6

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

  • ベストアンサー
回答No.1

(1) 自宅PCにて検証した結果、パターンBのほうが若干早いようです。 (2) preg_match関数、ereg関数ともに、戻り値はbool(真偽値)です。 if(preg_match('/xxxxxxx/', $ip)){ } と後ろに特に何もつけないで記述するのでよいと思います。 (3) そもそも、IPアドレスはどのように取得するものになりますか? テキストファイル等に記入してスクリプトが動作するときにソレを読み出す場合 例えば、改行コードをつけたまま値のチェックをしてしまえば 正常な値が拾えないかと思います。 また、「サイト管理者」とは、どのようにWebサイトにアクセスするものになりますか? サイト管理者が自身でサーバを運用し、サイトにアクセスする場合はローカルからのアクセスになる ということであれば、どうにでもなりますが サイト管理者がレンタルサーバ等を導入し、自宅からアクセスを行う場合 一般的なプロバイダはIPアドレスを定期的に変更します。 その場合に逐一IPアドレスの設定を変更しなければなりません。 また、念のため確認ですが、上記preg_match関数とereg関数は正規表現にて、文字列のマッチングを行う関数になりますが 「.」はエスケープを(「.」⇒「\.」)しておりますか? エスケープを行わなかった場合、正常にチェックが働かないと思います。 (4) 「(3)」で応えたとおりIPが動的であった場合、サイト管理者なのに、設定を変更していないためにカウントされてしまう ということがあると思います。 IPアドレス以外の情報で振り分けを行ったほうがよいと思います。 が、私自身アクセス解析等、行ったことが無いので、スタンダードな方法が分からないので、 代替案もろくなものが思いつきませんでしたが、 【1】タブブラウザなどを利用して、USER_AGENT情報を特殊なものに書き換え、そのUSER_AGENTの場合は解析をはじく ⇒例えばIE7だと「Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)」という情報が取得されるので USER_AGENTを「HOGEHOGE_SITE_OWNER」などとする。 ※ただし他のサイトに行ったときもこのUSER_AGENTが使用されるので問題がある 【2】REFERER情報をよむ 自分自身だけがアクセスするaタグのリンクがされているHTMLを作成し常にそこからアクセスするようにして REFERER情報がそこからのアクセスの場合は無効にする。 ただし、その他のコンテンツに移動した場合にREFERERが書き換わるので そこからのアクセスの場合のみ、COOKIE情報を落とすようにして そのCOOKIEが存在している場合はアクセス解析を行わない。 など・・・ とりあえず、NINJATOOLSとか一般的なアクセス解析ツールがどのようにサイト管理者を認識しているかを見るのも よいかもしれません。

march4
質問者

お礼

ありがとうございました(^^) また何かありましたら、教えて下さいね。

march4
質問者

補足

>(1) >自宅PCにて検証した結果、パターンBのほうが若干早いようです。 一般的に、ereg系とpreg系だと、preg系の方が速いという話を聞いていたので質問をしたのですが、 私も実際に両者を試してみて、なんとなくなのですが(体感的に)eregの方が速いなと思っていました。 NullバイトをIPに入れられる方法があるかどうかは分かりませんが、もしあれば、まずいなと思い、 pregで今の所、検討しています。 >(2) >と後ろに特に何もつけないで記述するのでよいと思います。 boolが、偽(0)の場合に、if文を読ませる時には、どう記述すれば良いのでしょうか。 if(!preg_match('/xxxxxxx/', $ip)){ } 「!」を前に付ければ良いのでしょうか。(初歩的な質問ですみません。) >(3) >そもそも、IPアドレスはどのように取得するものになりますか? //パターン:(C):問題ありな書き方 $ip = $_SERVER['REMOTE_ADDR']; //サイト管理者のIPアドレス:「xxx.xxx.x.xxx」とする。 //IPアドレスが変わる度に、手書きで変更する。 $host_ip = "xxx.xxx.x.xxx"; if($ip !== $host_ip){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 } というような書き方と同様に、 if($ip !== "xxx.xxx.x.xxx"){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 } こちらでは、「"xxx.xxx.x.xxx"」のIPアドレスの箇所を手書きで設定するつもりでした。 いずれにしても、IPアドレスが変わるごとに手作業で書き換えるという、 かなりショボイものを想定していました。 その程度でも問題ないと感じていたため(苦笑)。 >例えば、改行コードをつけたまま値のチェックをしてしまえば >正常な値が拾えないかと思います。 上記のような書き方でも、改行コードは含みますでしょうか? また、含んでいるかどうかを確認する方法はありますでしょうか。 こういった部分の知識に疎いので、とても興味深く回答を読ませて頂きました。 >また、「サイト管理者」とは、どのようにWebサイトにアクセスするものになりますか? 一般の訪問者と同様に、 ネット上のどこかにリンクページを用意し、そこからアクセスして入るか、 URLを直接ブラウザに打ち込んでアクセスするか、のいずれかで検討しています。 >サイト管理者がレンタルサーバ等を導入し、自宅からアクセスを行う場合 まさに、これです。 >一般的なプロバイダはIPアドレスを定期的に変更します。 >その場合に逐一IPアドレスの設定を変更しなければなりません。 前述の通り、IPアドレスが変わる度に、変更するつもりでした。(お恥ずかしい) >「.」はエスケープを(「.」⇒「\.」)しておりますか? >エスケープを行わなかった場合、正常にチェックが働かないと思います。 こちらもご指摘頂き、助かりました。 現在の所、エスケープをしなくても、なぜか?、正常にチェックが働いています。(笑) "xxx.xxx.x.xxx"の中身(つまり、””以外の要素)を1つの文字列として解釈しているからなのでしょうか? 正規表現について全く詳しくないので、またしても、初歩的な質問をしているような気がします…。 >(4) >【1】USER_AGENT情報を特殊なもの「HOGEHOGE_SITE_OWNER」などにして、それをもとにはじく >※ただし他のサイトに行ったときもこのUSER_AGENTが使用されるので問題がある なるほど、と読ませて頂きました。 「HOGEHOGE_SITE_OWNER」ですと、ちょっと派手ですので(笑)、 分かりにくい範囲で、変えてみて、それをもとにチェックを行うという方法もあるなと思いました。 ただ、今更な話ですが、IPアドレスにしろ、USER AGENTにしろ、サイト管理人自身が出先(ネットカフェ等)から アクセスするなんていう場合には、一般の訪問者として扱われてしまい、問題がありそうですね。(苦笑) >【2】REFERER情報をよむ >自分自身だけがアクセスするaタグのリンクがされているHTMLを作成し常にそこからアクセスするようにして >REFERER情報がそこからのアクセスの場合は無効にする。 こちらは、なかなか良いなと感じました。 >ただし、その他のコンテンツに移動した場合にREFERERが書き換わるので >そこからのアクセスの場合のみ、COOKIE情報を落とすようにして >そのCOOKIEが存在している場合はアクセス解析を行わない。 なるほど…(まだ、COOKIE処理については詳しくありませんが)、こちらで改めて、記述し直してみようと思います! >NINJATOOLSとか一般的なアクセス解析ツールがどのようにサイト管理者を認識しているかを見るのも >よいかもしれません。 そうですね! 以上、頂いた回答はとても参考になる有り難いものでした! では、ひとまず、(4)【2】だとどうなるか、やってみようと思います。

その他の回答 (4)

回答No.5

スクリプトが複雑になってきているところで、変数の衝突が発生するようであれば、 ソレらある一定の部分を関数化していくのも手だと思います。 define('OWNER_IPADDR', '127.0.0.1');//サイト管理者のIP $DB = sqlite_open('hogehoge');//DB接続 $ip = $_SERVER['REMOTE_ADDR'];//とりあえずgetenvでもなんでもIPを取得 $ua = $_SERVER['HTTP_USER_AGENT'];//例えばユーザエージェント情報も取得する if(!isOwner($ip)){ //サイト管理者じゃなければカウント処理 insert_server_info($ip, $ua); } /*======================== サイト管理者のIPかどうかを判別関数 ========================*/ function isOwner($ipaddr){ if($ipaddr == OWNER_IPADDR){ return true; } return false; } /*======================== 受け取ったリクエストを保存する関数 ========================*/ function insert_server_info($ipaddr, $useragent){ global $DB; //エスケープ処理 $ipaddr = sqlite_escape_string($ipaddr); $useragent = sqlite_escape_string($useragent); //fieldがipとuaだった場合 $sql = "INSERT INTO hogeTbl ( ip, ua ) VALUES ('".$ipaddr."', '".$useragent."' )"; return sqlite_query($DB, $sql); } 一例です。 上記スクリプトでは、実際にその値に何らかのアクションを与える場合には関数ないのコピーを操作しますので、勝手に変数に格納した値が書き換わるということも抑えられます。

march4
質問者

お礼

ありがとうございました(^^) また何かありましたら、教えて下さいね。

march4
質問者

補足

補足が遅れてしまいました~。 またしても、かゆい所に手が届くような回答をありがとうございます。 早速ですが、感想を。(もはや、補足ではない。笑) 変数の衝突を避けるために、自作関数を用意し、その関数の外で定義(というか、設定というか…)した変数を、 それらの関数の中に引き込み、その中で扱う分には、外で定義(というか、設定というか…)した変数の値を書き換えて しまわないようにできるという考え方を知り、大変参考になりました。 余談ですが、今回この質問を通して、質問内容の解決はもちろんのこと、その周囲にあるモヤモヤしていた事柄をも解決・理解できて しまえたように思えていて、この質問をして良かったなぁ~とつくづく思いました。 例えば、 $DBという大文字での変数名の付け方、 sqlite_escape_string()によるエスケープ処理、 VALUES ('".$ipaddr."', '".$useragent."' )の部分の、'".$ipaddr."'の書き方 (シングルクオートの中にダブルクオートがあるなんて!びっくり!)、 これらが気になりました。 個人的には、$DBのように、大文字で変数名を付けることはしないので、どういう意図で大文字を使っているのだろうかー!と、 一人興奮していました。笑 次に、sqlite_escape_string()なんてものも使うのかー!勉強が足りないなぁー、もっと頑張ろう!みたいに思ったわけです。 また、 自作関数の名前の付け方についても、 isOwner($ipaddr)と、大文字を含む名前もあれば、 insert_server_info($ipaddr, $useragent)と、大文字は含まず「_」を使う名前もあり、こちらも気になりました。 何が言いたいかというと、hogehoge78さんは独自のルールでもって、自作関数に名前を付けているのだと思いますが、 未だにこの手のルールをしっかり構築できていない私には、hogehoge78さんのルールがどのようなものであるか、 とても気になったわけです。 以上、余談が過ぎましたが、要するに、知りたいことがいっぱいなわけです(ざっくり…笑) 今回も為になるアドバイスをありがとうございました。 毎回わくわくしながら読ませて頂いています。

回答No.4

IPアドレスに関しまして、 $ipに代入をする前の値はいかがでしょうか。 var_dump($_SERVER['REMOTE_ADDR']); 最初のこの時点で、半角が含まれているといった場合、 スーパーグローバル変数である$_SERVERに他のモジュール(記述以前にinclude/requireしているもの)が何らかの文字を代入している、と思います。 この時点で問題が無いのであれば、$ipがどこかで衝突しており何らかの値を追加してしまっている可能性はあります。 特にブラウザの見た目上、半角一字分であるのに、3バイト分の差がありますので、それは半角スペースではなくて、 何らかの別の文字コードが代入されている可能性は高いです。 ブラウザ(少なくともIEは)は改行やタブは半角スペースで表現されますので、 一度ブラウザで出力されたものをブラウザの「ソースを表示」よりソースを見てみてください。 メモ帳でブラウザに表示されたものが記述どおりに出力されます。(IEだとデフォルトでメモ帳にて表示されます) また、含まれているものが分かったとして、スクリプト中のどこでそれが混入されているか分からないようであれば、 $ip = $_SERVER['REMOTE_ADDR']; の部分を、 $REMOTE_ADDR = getenv('REMOTE_ADDR'); といったように、他で絶対使われないであろう変数名及び、環境変数をgetenv関数で取得するという方法に変えてみてはいかがでしょうか。 また、今回のように一度決めたらその後スクリプト中絶対に変更を起こさないものは、定数とするのもよいと思います。 define('REMOTE_ADDR', getenv('REMOTE_ADDR')); これでREMOTE_ADDRという定数が定義され、以降、 echo REMOTE_ADDR; といったように引くことが出来ます。 一度定義するとそれ以降変更不可能なものとなります。 詳しくはPHPマニュアルや、「PHP 定数」などで検索すると、有用な使い方が出てくると思います。 以上です。

march4
質問者

お礼

さて、多少コードが長くなりましたが、 問題がどこにあるか見えてきたように思います。 原因は、このスクリプトが書かれているファイルの先頭で取得しているIPアドレス、 $ip = $_SERVER['REMOTE_ADDR']; この$ipの中身が、どこかで変わってしまっていることにあるようです。 当初、変わっていないだろうと思い、そして、それを確認する意味でも、 $ipを使う前に、echo $ip; というようにして確認し、ブラウザ上では問題なくIPアドレスを返していたので、そのまま、 if($ip == $host_ip){~ とコードを書いていましたが、 実はファイル先頭の$ipとアクセスカウント直前の$ipでは、 同じように見えて、実は違っていた、ということが分かりました。 それは、上のチェックコードパート1とパート2の違いから、 分かったことです。 ちなみに、パート3からは、環境変数を変えても同じことができるんだな~という勉強になりました。 (なお、パート4は必要ないですね、失礼。苦笑) つまり、パート3を出すまでもなく、パート2で問題の原因が分かったということです。 で、さらに、string(13)とstring(16)の違いをブラウザの「ソースを表示」により、確認してみたところ、 タブ文字が入っていました。3バイトの違いは、タブ文字だったのですね~。 (ブラウザの表示上では、それが確認できなかった、ということが今回の問題解決を遅らせる1つの大きな要因だったのではないかと思っています。) 以上のことをまとめますと、 解説するまでもなく、ファイル先頭で受け取った$ipが、アクセスカウント直前までの間に、タブ文字を含む過程を経たということですよね。 ざっと調べた感じでは、途中$ipは、データベース操作の際に登場しており、そこでタブが含まれたのでは?と考えています。 使っているDBはsqlite.2です。 ちなみに、カラムタイプをVARCHAR(20)としているカラムに$ipを格納しています。(←あやしい。笑) また、 define('REMOTE_ADDR', getenv('REMOTE_ADDR')); こちらも参考になりました。

march4
質問者

補足

今回も貴重なお時間を割いてアドバイスして下さり、本当にありがとうございます。 早速ですが、アドバイスに従い、チェック作業をしてみました。 PHP コード --------------------- <?php echo "■Check Part1■"."<br><br>"; var_dump($_SERVER['REMOTE_ADDR']); echo "<br><br>"; echo $ip; echo "<br><br>"; $host_ip = "xxx.xxx.x.xxx"; if($ip == $host_ip){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 echo "Part1 ★希望通り★"; } else{ echo "Part1 ★希望通りにはならず★"."<br><br>"; var_dump($ip); var_dump($host_ip); } echo "<br><br>"."---------------------"."<br><br>"; echo "■Check Part2■"."<br><br>"; var_dump($_SERVER['REMOTE_ADDR']); echo "<br><br>"; $ip_new = $_SERVER['REMOTE_ADDR']; echo $ip_new; echo "<br><br>"; $host_ip = "xxx.xxx.x.xxx"; if($ip_new == $host_ip){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 echo "Part2 ★希望通り★"; } else{ echo "Part2 ★希望通りにはならず★"."<br><br>"; var_dump($ip_new); var_dump($host_ip); } echo "<br><br>"."---------------------"."<br><br>"; echo "■Check Part3■"."<br><br>"; var_dump(getenv('REMOTE_ADDR')); echo "<br><br>"; $ip = getenv('REMOTE_ADDR'); echo $ip; echo "<br><br>"; $host_ip = "xxx.xxx.x.xxx"; if($ip == $host_ip){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 echo "Part3 ★希望通り★"; } else{ echo "Part3 ★希望通りにはならず★"."<br><br>"; var_dump($ip); var_dump($host_ip); } echo "<br><br>"."---------------------"."<br><br>"; echo "■Check Part4■"."<br><br>"; var_dump(getenv('REMOTE_ADDR')); echo "<br><br>"; $remote_addr = getenv('REMOTE_ADDR'); echo $remote_addr; echo "<br><br>"; $host_ip = "xxx.xxx.x.xxx"; if($remote_addr == $host_ip){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 echo "Part4 ★希望通り★"; } else{ echo "Part4 ★希望通りにはならず★"."<br><br>"; var_dump($remote_addr); var_dump($host_ip); } exit; ?> ////////////////////////// ブラウザ出力結果(FireFox) --------------------- ■Check Part1■ string(13) "xxx.xxx.x.xxx" xxx.xxx.x.xxx Part1 ★希望通りにはならず★ string(16) " xxx.xxx.x.xxx" string(13) "xxx.xxx.x.xxx" --------------------- ■Check Part2■ string(13) "xxx.xxx.x.xxx" xxx.xxx.x.xxx Part2 ★希望通り★ --------------------- ■Check Part3■ string(13) "xxx.xxx.x.xxx" xxx.xxx.x.xxx Part3 ★希望通り★ --------------------- ■Check Part4■ string(13) "xxx.xxx.x.xxx" xxx.xxx.x.xxx Part4 ★希望通り★ ////////////////////////// となりました。

回答No.3

■値の比較に関して 「!==」や「===」は型まで厳格に比較する比較子なので、型が変わってしまっているのかもしれません。 var_dump関数にて、両者の値がどのようになっているかを確認して、同じものになっているのであれば 原因はなんとも・・・ if($ip == $host_ip){ //こちらに入ってくれない! } else{ var_dump($ip); var_dump($host_ip); } ■サイトを複製する件 それでも問題ないですが、サイト規模が少し増えて10枚必要になった場合など、 改修の手間がかからないように作成したほうがよさそうです。 ・count.php(カウンタ用PHP) ・main.php(サイトのメインが記述されているもの) ・index.php(上記二つを読み込むもの) ・index_owner.php(main.phpだけを読み込む) --index.php------- <?php require_once 'count.php'; require_once 'main.php'; --index_owner.php------ <?php require_once 'main.php'; このように作成すれば、少なくともメインで使用しているスクリプトを大幅に変更をかけても アクセスカウントの振り分けはされます。 出来るだけ作業が少ないようにするのがベターと思われます。

march4
質問者

お礼

ありがとうございました(^^) また何かありましたら、教えて下さいね。

march4
質問者

補足

またしても、明解かつ有益なアドバイスをありがとうございます。 毎回、助かります。 早速ですが、var_dump関数で調べた結果をお伝えします。 (このような方法で調べられることを知らなかったため、大変勉強になりました。) PHPコード ////////////////////////////////////////////////////// <?php $ip = $_SERVER['REMOTE_ADDR']; //この時点で$ipがどうなっているか念のため確認 //この処理によってブラウザに出力されたIPをコピーして、 //下の「$host_ip = "xxx.xxx.x.xxx"; 」の式の右辺にペーストしています。 echo $ip."<br><br>"; //以下、手書きで管理者のIPを設定 //前述の通り、下記式の右辺はペースト。 $host_ip = "xxx.xxx.x.xxx"; if($ip == $host_ip){ //$ip == "xxx.xxx.x.xxx" でなかった場合の処理 echo "ok"; } else{ var_dump($ip); var_dump($host_ip); } exit; ?> ////////////////////////////////////////////////////// ブラウザでの表示 ------------------------------------------------------ xxx.xxx.x.xxx string(16) " xxx.xxx.x.xxx" string(13) "xxx.xxx.x.xxx" ------------------------------------------------------ 以上の結果から、気になったことを2つ書きます。 (1)string(16)の後の「" "」の中身の先頭に、半角スペースがある。 (2)string( )の「( )」の中身の数字が異なる。 本件で問題となっているのは、言うまでもなく、(2)でしょう。 また、その数字の違いは「.」をカウントしているか、していないかの違いなのだと思います。では、なぜ、カウントの仕方が異なるのか。 謎ですね~。苦笑 (もし、分かりましたら、教えて頂けると大変ありがたいです。) ひとまず、var_dump()で、さらに一歩前進したように思います。 問題解決まで、あと少しといったところでしょうか! >■サイトを複製する件 >出来るだけ作業が少ないようにするのがベターと思われます。 こちらも大変参考になりました!

回答No.2

■boolが偽の場合 !を先頭につけるということで、その通り、問題ございません。 ■改行コードに関して IPアドレスをどのように拾うかというところが分からなかったので CSVファイルかなにかに記述してソレを逐一ロードしてくると思ってました。 その場合、取得してきたデータの最後に改行コードがあれば、 余計な改行コードが含まれるなと思いました。 スクリプトにベタ書きであれば原因は別と思います。 例えば、""で囲うのを忘れていて、111.111.111.111が.で連結して111111111111になってしまっているとか・・・ ■正規表現部分について 「.」は何らかの一文字と認識されます。 条件としてはマッチング結果が正常に働きますが、 意味合いとして認識していないと改修を行う場合に悩みが増えることもあると思います。 ■IPアドレス 手動で逐次更新するにしても、自分自身のIPアドレスが変更された場合に通知されるものではないので アクセスする毎にIPアドレスを意識するのは結構面倒ですし、頻繁に変更がある場合に モチベーションも下がりますので、あまりオススメは出来ないですね・・・ ■【2】の方法 if($ref == $_SERVER['HTTP_REFERER']){ setcookie('site_owner','value',expire,path); } if($_COOKIE['site_owner'] != 'value'){ //アクセス解析の処理 } など。

march4
質問者

お礼

ありがとうございました(^^) また何かありましたら、教えて下さいね。

march4
質問者

補足

さらなる回答をありがとうございます。 >スクリプトにベタ書きであれば原因は別と思います。 例えば、""で囲うのを忘れていて、111.111.111.111 ん~、そんなこともないんですよね…。 文字コードに違いがあるのかと思い、2者において文字コードの比較をしたのですが、どちらも同じでした。 $_SERVER['REMOTE_ADDR'] == "xxx.xxx.x.xxx" であるのに、 $ip = $_SERVER['REMOTE_ADDR'];  $host_ip == "xxx.xxx.x.xxx"; if($ip == $host_ip){ //こちらに入ってくれない! } else{ //なぜかこちらへ入ってくる } 原因不明です。。 >■【2】の方法 参考にさせて頂きますね^^ if($_COOKIE['site_owner'] !== 'value'){ //処理 } 「!==」の辺りで、私はよく書きミスをします。^^; なお、クッキーを使った方法の他に、もう一つ方法を思い浮かびまして、 その方法で今、検討しているところです。 はっきり言ってダサダサですが、サイトの規模が小さいので、これでもなんとかなるかなと思っています。 その方法は、不特定多数の訪問者が訪れる通常のページとほとんど同じページを管理者用に作り、管理者はその管理者用のページだけを利用するというものです。管理者用のページにはもちろんアクセスカウンターは設置しません。 ファイル自体は異なりますが、共通のスクリプトを読み込む、または、同じスクリプトを記述(全体的にほぼ複製)することで、他の訪問者と同じ状況で管理者は利用でき、かつ、カウントされない仕組みを構築できるのではないかと考えました。 (ちなみに、ファイル数は3,4枚です。)

関連するQ&A

  • グローバルIPアドレスについて

    社内のネットワーク管理者が休みなんです。助けて下さい。 うちの会社のルーターはCISCO2600シリーズ ケーブルは物理的に下記のように繋がっています。 プロバイダー--->f0/0(CISCO 2950)f0/1--->ファイヤーウォール さて、今自分のPCからYahooにtracertを試すと、xxx.xxx.xxx.xx7と出ました。 次にhttp://whatismyipaddress.com/ で調べたIPアドレスはxxx.xxx.xxx.xx8と出ました。 このときうちの会社のグローバルIPアドレスはどっちなんでしょう。取引先のサーバーにアクセスするのにIPアドレスを伝えないといけません。 どっちをいえば言いのでしょうか? また、f0/0 f0/1はそれぞれどっちのIPアドレスですか?

  • PHPによるIPアドレスマッチ

    こんにちは。現在、掲示板などに使うアクセス制限ライブラリを作っています。 やりたいことは、制限したいIPアドレスのリストを作り、そのリストの中に接続元のIPが含まれているかどうかを調べたいのです。 制限したいIPアドレスのリストには、IPアドレスの範囲表現(?)を使うことができるようにしたいと考えています。 例: $deny[0] = 'xxx.11.11.11'; $deny[1] = 'xxx.11.22.33'; $deny[2] = 'xxx.11.33.*'; 上記の「*」のようにです。 ここで、 $ip = 'xxx.11.33.12'; が、$denyに含まれているかどうかを調べたいのです。 正規表現を使うのかとも考えましたが、なかなか理解できません。 もし、お分かりになりましたら回答よろしくお願いいたします。

    • 締切済み
    • PHP
  • IPアドレスについて

    ネットワークの勉強を始めたばかりなのですが IPアドレスについて教えてください。 192.168.XXX.XXX このパターンはクラスCだと思うのですが 何故、192.168から始まるアドレスが多いのですか? 理屈が分からなくて次に進めません。 よろしくお願いします。

  • IPアドレスがちがう!

    プライベートなサイトの公開範囲を特定のIPアドレス(自分)だけにしようと.htaccessで order deny,allow deny from all allow from xxx.xxx.xxx.xxx allow from xxx.xxx.xxx.xxx allow from xxx.xxx.xxx.xxx というふうにしていたのですが、仕事場のPC(IPアドレス)だけ許可できません。 で調べてみると、「ipconfig/all」で得られたIPアドレスとPHPの「$_SERVER['REMOTE_ADDR']」で得られたIPアドレス(実際にサーバーにアクセスしてきたクライアント)が違うのです。 なでに(.ŏωŏ.)? 結局、「$_SERVER['REMOTE_ADDR']」で得られたIPアドレスで無事制御できましたが、原因は分からずじまいです。 どなたか原因がお分かりの方、ご教授の程お願い致します。 OS: WindowsXP SP3 仕事場のPCは無線LANで接続されています。

  • IPアドレスのドメインを調べたいです

    xxx.xxx.xxx.xxxのアドレスからアクセスがあり、nslookupで調べると  Non-existent domain が返ってきて、DNSに未登録のホストからのアクセスのようです。 IPアドレスの範囲から割り当てられているドメインを知ることは可能でしょうか。 また地域、国名を知ることはできますでしょうか。 ネットワークに詳しい方、よろしくお願いします。

  • IPアドレスについて 

    IPアドレスが、 A 2008.07.26 17:49:07 IP xxx.111.xxx.222 B 2008.07.26 16:59:12 IP xxx.22.xxx.333 とします。 そして、 A 2008.08.01 13:09:39 IP xxx.111.xxx.222 B 2008.08.02 15:31:04 IP xxx.22.xxx.333 A 2008.08.15 01:20:18 IP xxx.111.xxx.222 B 2008.08.16 00:09:04 IP xxx.22.xxx.333 A 2008.08.25 23:32:46 IP xxx.111.xxx.222 B 2008.08.26 21:57:22 IP xxx.22.xxx.333 A 2008.09.18 23:20:58 IP xxx.111.xxx.222 B 2008.09.18 22:31:07 IP xxx.22.xxx.333 という結果を得られた場合、 このAという人物とBという人物は同一人物と考えてもいいのでしょうか。 当方、IP等こういうことに疎いですので、 何卒ご教授いただければ幸いです。 何卒ご回答の程、宜しくお願いいたします。

  • IPアドレスを変更してもフォルダが共有できるようにするには

    パソコンAとパソコンBがネットワーク上にあります。 AのIPアドレスは仮にxxx.yyy.55.123とします。 BのIPアドレスは仮にxxx.yyy.55.456とします。 この場合はAのフォルダを共有にした時に、 Bからちゃんとアクセス出来ます。 ここで、Bのアドレスを xxx.yyy.50.456とすると、 Aを認識することは出来るのですが、 アクセスしようとすると権限がないと言われてしまいます。 50.456にした場合でもアクセスできるような方法があれば 教えてください。

  • IPアドレスについていろいろ知りたい

    1 IPアドレスはどのようにして決まるのでしょうか。またそれは一度与えられると、変わることは無いのでしょうか? 2 人に知られると良くないものなのでしょうか? 3 インターネットサイトの管理者には誰がアクセスしたかを知ることができるのでしょうか?その時にIPアドレスによって認知してるのでしょうか? 4 3のようにIPアドレスによって例えばアダルトサイトにアクセスを知られているのだとすれば、アクセスしたことを相手にわからないようにすることはできますか?

  • DoCoMoのIPアドレスについて

    DoCoMo携帯についての話なんですが、携帯のIPアドレスはDoCoMoについてはアクセス毎に変わるらしいのですが本当なのでしょうか。変わらないときもあるのでは?また、アクセス毎に常に変わるのならば管理人は、例えばチャットなどでユーザーがニックネームを変えアクセスし直されればIPアドレスもニックネームも変わるので、そのユーザーがわからなくなり、迷惑行為などを防げなくなるのではないのですか?そして逆にIPアドレスが常には変わらず、同じIPアドレスが何回か続くときがあるのであれば、なにかのきっかけで管理人以外のユーザーにIPアドレスと持ち主がわかった場合(IPアドレスとメールアドレスを同時に知られた、など)、他のユーザーにIPアドレスによって使用者がわかってしまうのでは?

  • IPアドレス拒否処理の正規表現とstr_repla

    下記のようなサンプル(の一部)があるのですが、IF文の条件式の意味が分かりません。 while ( $out = $db->fetch_result($result) ) {  $out['ip_addr'] = stripslashes($out['ip_addr']);  if ( !$ip_banned && preg_match('#^'.str_replace(array('\*', '\?'), array('[0-9]*', '[0-9]'), preg_quote($out['ip_addr'])).'$#', $ip_addr) )  $ip_banned = true; 分解してみました。 ・if ( A ) ・A … !$ip_banned && B ・B … preg_match('#^'.C.'$#', $ip_addr) ・C … str_replace(array('\*', '\?'), array('[0-9]*', '[0-9]'), preg_quote($out['ip_addr']) クオートしたIPアドレスに、「*」か「?」があれば、「数字*」か「数字」に置き換える? さらに、その結果が、$ip_addrの中に、当てはまるか、確認? 意味が分かりません……。 IF文の条件式で、何をしようとしている(と想定される)か、教えてください

    • ベストアンサー
    • PHP

専門家に質問してみよう