2011-01-13 10 views
2

を使用して、ユーザー実IPアドレスを取得すると、彼らはhidemyass.comは、私は自分のサイトに行くのユーザーから実際のIPアドレスを取得したいPHP

のようなプロキシのウェブサイトを使用する場合でも、これは私が持っているコードであり、それが働いたと思ったが、私はそれをテストしたが、それはしません

<?php 
function getRealIpAddr() 
{ 
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) //check ip from share internet 
    { 
     $ip=$_SERVER['HTTP_CLIENT_IP']; 
    } 
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) //to check ip is pass from proxy 
    { 
     $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; 
    } 
    else 
    { 
     $ip=$_SERVER['REMOTE_ADDR']; 
    } 
    return $ip; 
} 
?> 

私はこのコードは動作すると思ったが、プロキシはまだそれをバイパスしました。

ありがとうございます。

+5

誰かが自分のIPを隠したい場合は、何があなたにそれを知っている必要がありますする権利を与えますか? – Skilldrick

+0

あなたはプロキシをブラックリストに登録することができますが、それは非常に進行中の仕事でしょう;-) – ChristopheD

+0

あなたにはおそらくより良いチャンスがあります:) – webbiedave

答えて

19

実際のIPアドレスを取得する保証はありません。プロキシーからその匿名プロキシーについて伝えたくなければになりません。

6

できません。あなたが持っている情報は、apache/iis/whateverのものであり、誰があなたのサーバと話しているか知っているだけです(この場合、プロキシです)。プロキシがヘッダー内の情報を送信しない限り、それを取得しません。

X-Forwarded-Forは可能な限り最高ですが、匿名プロキシがそれを送信する可能性は低いです。

0

iは、ユーザがプロキシが共通(ヘッダに実際のIPアドレスを入れない限り

determine if user is using proxy

+0

Euhm、これは質問と同じスニペットです... – ChristopheD

+0

これはOPと同じ正確なコードではありませんか? – jasonbar

+0

ええ、私はどこからスクリプトを入手したのかのリンクを提供しています.... – bharath

2

を助けるかもしれないプロキシを使用しているかどうかを確認するためにいくつかのより多くのヘッダーを確認するために、ここで同様のポストを見つけました - プロキシが使用されている理由によって)(通常は「X-something」という形式で)、プロキシのIPアドレスしか見ることができません。

5

IPアドレスをエンコードするアプリケーション層に何らかの種類の認証プロトコルを実装していない限り、実際のIPアドレスを取得することはできません(または、スプーフィング対象)。

これはなぜですか?

IPデータパケットは、アクセス権のある「中」の人が任意に書き換えることができるためです。例えば、などのプロキシ、ルータ、ゲートウェイ、

アンIPデータパケットが

| stuff | src ip | dst ip | stuff | 
| .... | 32-bits| 32 bits | stuff | 

だから、SRC IPをこのような構造を持っている - それらはちょうどビットであり、覚えている - 任意に上書きすることができます。

http://www.faqs.org/rfcs/rfc791.html詳細情報を提供します。

0

してみてください。この

function get_IP_address() 
{ 
    foreach (array('HTTP_CLIENT_IP', 
       'HTTP_X_FORWARDED_FOR', 
       'HTTP_X_FORWARDED', 
       'HTTP_X_CLUSTER_CLIENT_IP', 
       'HTTP_FORWARDED_FOR', 
       'HTTP_FORWARDED', 
       'REMOTE_ADDR') as $key){ 
    if (array_key_exists($key, $_SERVER) === true){ 
     foreach (explode(',', $_SERVER[$key]) as $IPaddress){ 
      $IPaddress = trim($IPaddress); // Just to be safe 

      if (filter_var($IPaddress, 
          FILTER_VALIDATE_IP, 
          FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) 
       !== false) { 

       return $IPaddress; 
      } 
     } 
    } 
} 
} 
関連する問題