クライアントIP、HTTP_の取得CLIENT_IPは詐欺ですか?
2312 ワード
質問:
クライアントIPを取得すると、多くのコードが
答え:
それに比べて、前の2つのipアドレスはhttpヘッダで偽造することができますが、何の役にも立たないわけではありません.生産環境では多くのサーバが負荷等化ノードの後ろに隠れており、
バックエンドがこの値を読み取るのは、クライアントではなく負荷等化ノードが教えてくれたため、信頼性があります.ただし、サーバがクライアントの前に直接露出している場合は、この2つの読み取り方法を信用しないでください.
回答を聞いた上でのまとめです.
場合によっては
クライアント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:一般的にはそうはしません)