2012-03-03 10 views
4

でHTTP_X_FORWARDED_FORエラー私は通告を取得しています:未定義のインデックス:HTTP_X_FORWARDED_FOR以下の機能で:お知らせ:未定義のインデックス:機能

function _ip() 
{ 
    return (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']); 
} 

答えて

15

$ _SERVERの代わりにgetenv()メソッドを使用する必要があります。スパマーは、彼らはREMOTE_ADDRを変更することはできませんしながら、彼らが望むものにHTTP_X_FORWARDED_FORヘッダ自分自身を設定することができますよう

function _ip() 
{ 
    if (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", getenv('HTTP_X_FORWARDED_FOR')) 
    { 
     return getenv('HTTP_X_FORWARDED_FOR'); 
    } 
    return getenv('REMOTE_ADDR'); 
} 

また、私はちょうど$ip = getenv('REMOTE_ADDR')に固執するでしょう。問題は、「良い」プロキシがHTTP_X_FORWARDED_FORについて真実を伝えるので、あなたがそれを見逃してしまうことです。

+2

「良い」プロキシが有効なX-Forwarded-Forを提供していても、RFC1918のプライベートIPのように、それらのヘッダーの値の多くは望ましくないものになります。 – duskwuff

3

$ _SERVER [ 'HTTP_X_FORWARDED_FOR']は、あなたの配列には存在しません。 print_r($_SERVER)で確認できます。あなたはそれを使用する前にその配列インデックスの存在をテストする必要があります。

function _ip() 
{ 
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { 
     return (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']); 
    } else { 
     return null; //something else 
    } 
} 
1

ヘッダーはありません。アクセスする前に確認する必要があります。

function _ip() 
{ 
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) { 
     if (preg_match("/^([d]{1,3}).([d]{1,3}).([d]{1,3}).([d]{1,3})$/", $_SERVER['HTTP_X_FORWARDED_FOR']) 
      return $_SERVER['HTTP_X_FORWARDED_FOR']; 
     } 
    } 
    return isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ''; 
} 
0

明らかに、インデックスは$ _SERVER配列に存在しないためです。

if(isset($_SERVER['HTTP_X_FORWARDED_FOR']) { 
    // your code here 
} else { 
    if(isset($_SERVER['REMOTE_ADDR'])) 
    return $_SERVER['REMOTE_ADDR']; 
    else 
    return FALSE; 
} 

私はリモートアドレスを取得しようとしていると思いますが、上記のコードはもう少し堅牢であるかもしれません。

関連する問題