クライアントIP、HTTP_の取得CLIENT_IPは詐欺ですか?

2312 ワード

質問:
クライアントIPを取得すると、多くのコードがHTTP_CLIENT_IPの値を持ち、次いでHTTP_X_FORWARDED_FOR、最後にREMOTE_ADDRを持つ.
 
答え:REMOTE_ADDRは明示的に偽造することはできません.エージェントによってipアドレスを隠すことができますが、このアドレスはサーバに実際に接続されているipアドレスであるため、参照価値があります.
それに比べて、前の2つのipアドレスはhttpヘッダで偽造することができますが、何の役にも立たないわけではありません.生産環境では多くのサーバが負荷等化ノードの後ろに隠れており、REMOTE_ADDRを通じて負荷等化ノードのipアドレスしか取得できません.一般的な負荷等化ノードは、フロントエンドの実際のipアドレスをHTTP_CLIENT_IPまたはHTTP_X_FORWARDED_FORの2つのhttpヘッダを通じて伝達します.
バックエンドがこの値を読み取るのは、クライアントではなく負荷等化ノードが教えてくれたため、信頼性があります.ただし、サーバがクライアントの前に直接露出している場合は、この2つの読み取り方法を信用しないでください.REMOTE_ADDRを読み取るだけでいいです.
 
回答を聞いた上でのまとめです.HTTP_CLIENT_IPヘッダはありますが、標準化されていないため、必ずしもサーバが実現しているとは限りません.2.HTTP_X_FORWARDED_FORは、HTTP を通過したクライアントIPアドレスを識別するための標準定義であり、フォーマット:clientip,proxy1,proxy2.詳しくはhttp://zh.wikipedia.org/wiki/X-Forwarded-For3.REMOTE_ADDRは信頼性があり、それは最後にあなたのサーバーと握手したIPで、ユーザーのエージェントサーバーかもしれないし、自分の逆エージェントかもしれない.偽造について:HTTP_*頭はいずれも偽造しやすい.例えば、火狐プラグインを使用してx-forwarded_for IPを8.8.8.8と偽造した場合、クッキーをクリアして再アクセスするhttp://www.58.comああ、8.8.8.8だと思っています.参考:sf上のもう一つのIP偽造に関する問題は、IPコードを取得するのに良いです.
function get_client_ip()
{
    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)) {
            foreach (explode(',', $_SERVER[$key]) as $ip) {
                $ip = trim($ip);
                //               IP,   127.0.0.1    
                //          IP
                if ((bool) filter_var($ip, FILTER_VALIDATE_IP,
                                FILTER_FLAG_IPV4 |
                                FILTER_FLAG_NO_PRIV_RANGE |
                                FILTER_FLAG_NO_RES_RANGE)) {
                    return $ip;
                }
            }
        }
    }
    return null;
}

場合によってはREMOTE_ADDRしか取得できないことも考えられます(PS:一般的にはそうはしません)