Get client IP, HTTP_CLIENT_IP is a scam?

Source: Internet
Author: User
Tags get ip
Get the client IP, a lot of code will take HTTP_CLIENT_IPThe value of the second take HTTP_X_FORWARDED_FOR, the last is REMOTE_ADDR
For a discussion of this, see: http://www.douban.com/group/topic/27482290/
A good comparison of getting client IP and verifying IP code is what

The following is a summary of what to do after listening to answers
1. The HTTP_CLIENT_IP head is there, but not the standard, not necessarily the server has been implemented.
2. HTTP_X_FORWARDED_FOR There is a standard definition, used to identify HTTP代理 after the client IP address, format: clientip,proxy1,proxy2 . See Http://zh.wikipedia.org/wiki/X-Forwarded-For for a detailed explanation.
3. REMOTE_ADDR is reliable, it is the last to shake hands with your server IP , may be the user's proxy server, may also be their own reverse proxy.
About counterfeiting: The HTTP_* head is easy to forge. For example, using the Firefox plugin to forge the x-forwarded_for IP 8.8.8.8 , when you clear the cookie and then access http://www.58.com, it will think you are 8.8.8.8 coming. Reference: SF on another question about fake IP
A good Get IP code:

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;}

Refer to @joyqi ideas, some situations can be considered only get REMOTE_ADDR (PS: generally do not do)

Reply content:

To get the client IP, a lot of code will take HTTP_CLIENT_IP the value, followed by HTTP_X_FORWARDED_FOR , and finally REMOTE_ADDR .
For a discussion of this, see: http://www.douban.com/group/topic/27482290/
A good comparison of getting client IP and verifying IP code is what

The following is a summary of what to do after listening to answers
1. The HTTP_CLIENT_IP head is there, but not the standard, not necessarily the server has been implemented.
2. HTTP_X_FORWARDED_FOR There is a standard definition, used to identify HTTP代理 after the client IP address, format: clientip,proxy1,proxy2 . See Http://zh.wikipedia.org/wiki/X-Forwarded-For for a detailed explanation.
3. REMOTE_ADDR is reliable, it is the last to shake hands with your server IP , may be the user's proxy server, may also be their own reverse proxy.
About counterfeiting: The HTTP_* head is easy to forge. For example, using the Firefox plugin to forge the x-forwarded_for IP 8.8.8.8 , when you clear the cookie and then access http://www.58.com, it will think you are 8.8.8.8 coming. Reference: SF on another question about fake IP
A good Get IP code:

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;}

Refer to @joyqi ideas, some situations can be considered only get REMOTE_ADDR (PS: generally do not do)

REMOTE_ADDRCan not be forged explicitly, although the IP address can be hidden through the proxy, but this address still has reference value, because it is the actual connection with your server IP address.

In contrast, the first two IP addresses can be forged through HTTP headers, but that doesn't mean they are useless. Many servers in the production environment are hidden behind the load Balancer node, and you REMOTE_ADDR can only get the IP address of the Load Balancer node, and the general Load Balancer node will pass the actual IP address of the front end HTTP_CLIENT_IP or HTTP_X_FORWARDED_FOR the two HTTP headers.

The backend then goes to read this value is true and trustworthy, because it is the load Balancer node tells you instead of the client. But when your server is directly exposed to the front of the client, do not trust the two read methods, only need to read REMOTE_ADDR the line

  • Related Article

    Contact Us

    The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

    If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.