Hướng dẫn php check ip range - php kiểm tra phạm vi ip

Tôi đã sử dụng cái này cho khách hàng của mình:

$clientIpArray = explode(".", $clientIp);
$fromArray = explode(".", $from);
$toArray = explode(".", $to);
        
if( ((str_pad($clientIpArray[0], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[0], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[0], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[0], 3, "0", STR_PAD_LEFT)))
 &&((str_pad($clientIpArray[1], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[1], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[1], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[1], 3, "0", STR_PAD_LEFT)))
 &&((str_pad($clientIpArray[2], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[2], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[2], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[2], 3, "0", STR_PAD_LEFT)))
 &&((str_pad($clientIpArray[3], 3, "0", STR_PAD_LEFT) >= str_pad($fromArray[3], 3, "0", STR_PAD_LEFT)) && (str_pad($clientIpArray[3], 3, "0", STR_PAD_LEFT) <= str_pad($toArray[3], 3, "0", STR_PAD_LEFT)))){
  echo "IP within range";
}

Ví dụ: chúng ta hãy lấy ví dụ này:

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";

Như bạn có thể hiểu IP này nằm trong phạm vi. Nếu bạn cố gắng so sánh nó vì nó sẽ không hoạt động. Giải pháp của tôi là chia IP thành các phần tử, ví dụ như các mảng được tạo sẽ là:

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];

Chúng tôi có 4 phần tử để so sánh, ở đây tôi đã sử dụng hàm STR_PAD để tạo chuỗi 3 ký tự từ mỗi phần tử, vì vậy thay vì kiểm tra xem "3" có nằm giữa "1" và "20" (không đúng), chúng tôi sẽ kiểm tra xem " 003 "nằm giữa" 001 "và" 020 "(đúng).str_pad function to generate a 3 characters string from each element, so instead of checking if "3" is between "1" and "20" (which is not true) we will check if "003" is between "001" and "020" (which is correct).

Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều

/**
* Kiểm tra xem IP đã cho có trong mạng không
* @param chuỗi $ ip ip để kiểm tra định dạng IPv4, ví dụ. 127.0.0.1
* Chuỗi @Param $ Range IP/CIDR NetMask EG. 127.0.0.0/24, cũng 127.0.0.1 được chấp nhận và /32 giả định
* @return boolean true nếu IP nằm trong phạm vi này / sai nếu không.
*/
hàm ip_in_range ($ ip, $ range) {
if (strpos ($ range, '/') == false) {
$ phạm vi. = '/32';
}
// $ Range ở định dạng IP/CIDR, ví dụ: 127.0.0.1/24
Danh sách ($ Range, $ NetMask) = Explode ('/', $ Range, 2);
$ Range_Decimal = ip2Long ($ Range);
$ ip_decimal = ip2Long ($ ip);
$ wildcard_decimal = pow (2, (32 - $ netmask)) - 1;
$ netmask_decimal = ~ $ wildcard_decimal;
return (($ ip_decimal & $ netmask_decimal) == ($ range_decimal & $ netmask_decimal));
}

Bất cứ điều gì bạn làm, hãy đảm bảo không tin tưởng dữ liệu được gửi từ khách hàng.

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4 chứa địa chỉ IP thực của bên kết nối. Đó là giá trị đáng tin cậy nhất bạn có thể tìm thấy.

Tuy nhiên, chúng có thể đứng sau một máy chủ proxy trong trường hợp proxy có thể đã đặt

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
5, nhưng giá trị này dễ dàng bị giả mạo. Ví dụ, nó có thể được đặt bởi ai đó không có proxy hoặc IP có thể là IP nội bộ từ mạng LAN phía sau proxy.

Điều này có nghĩa là nếu bạn định lưu

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
5, hãy đảm bảo bạn cũng lưu giá trị
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4. Ví dụ. Bằng cách lưu cả hai giá trị trong các trường khác nhau trong cơ sở dữ liệu của bạn.

Nếu bạn sẽ lưu IP vào cơ sở dữ liệu dưới dạng chuỗi, hãy đảm bảo bạn có không gian cho ít nhất 45 ký tự. IPv6 ở đây để ở lại và các địa chỉ đó lớn hơn các địa chỉ IPv4 cũ hơn.45 characters. IPv6 is here to stay and those addresses are larger than the older IPv4 addresses.

(Lưu ý rằng IPv6 thường sử dụng nhiều nhất 39 ký tự nhưng cũng có ký hiệu IPv6 đặc biệt cho các địa chỉ IPv4 ở dạng đầy đủ có thể lên tới 45 ký tự. Vì vậy, nếu bạn biết những gì bạn đang làm, bạn có thể sử dụng 39 ký tự, nhưng nếu bạn Chỉ muốn đặt và quên nó, sử dụng 45).

Đã trả lời ngày 9 tháng 6 năm 2010 lúc 5:15Jun 9, 2010 at 5:15

Emil Vikströmemil VikströmEmil Vikström

88.6K15 Huy hiệu vàng134 Huy hiệu bạc170 Huy hiệu đồng15 gold badges134 silver badges170 bronze badges

5

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4 có thể không thực sự chứa các địa chỉ IP máy khách thực, vì nó sẽ cung cấp cho bạn một địa chỉ proxy cho các máy khách được kết nối thông qua proxy, chẳng hạn. Đó cũng có thể là những gì bạn thực sự muốn, mặc dù, tùy thuộc vào những gì bạn làm với IPS. Địa chỉ RFC1918 riêng tư của ai đó có thể không tốt nếu bạn nói, cố gắng xem lưu lượng truy cập của bạn bắt nguồn từ đâu hoặc ghi nhớ IP mà người dùng kết nối cuối cùng, nơi IP công khai của Gateway proxy hoặc NAT có thể là thích hợp để lưu trữ.

Có một số tiêu đề HTTP như

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
9 có thể hoặc không thể được đặt bởi các proxy khác nhau. Vấn đề là đó chỉ là các tiêu đề HTTP có thể được đặt bởi bất kỳ ai. Không có gì đảm bảo về nội dung của họ.
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4 là địa chỉ IP vật lý thực tế mà máy chủ web đã nhận được kết nối và phản hồi sẽ được gửi đến. Bất cứ điều gì khác chỉ là thông tin tùy ý và tự nguyện. Chỉ có một kịch bản trong đó bạn có thể tin tưởng thông tin này: bạn đang kiểm soát proxy đặt tiêu đề này. Có nghĩa là chỉ khi bạn biết 100% ở đâu và làm thế nào tiêu đề được đặt nên bạn sẽ chú ý đến nó vì bất cứ điều gì quan trọng.

Phải nói rằng, đây là một số mã mẫu:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

Lưu ý của biên tập viên: Sử dụng mã trên có ý nghĩa bảo mật. Máy khách có thể đặt tất cả thông tin tiêu đề HTTP (nghĩa là

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
1) thành bất kỳ giá trị tùy ý nào mà nó muốn. Do đó, đáng tin cậy hơn nhiều khi sử dụng
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4, vì điều này không thể được đặt bởi người dùng.
Using the above code has security implications. The client can set all HTTP header information (ie.
$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
1) to any arbitrary value it wants. As such it's far more reliable to use
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4, as this cannot be set by the user.

Từ: http://roshanbh.com.np/2007/12/getting-real-ip-address-in-php.html

Đã trả lời ngày 11 tháng 9 năm 2008 lúc 4:01Sep 11, 2008 at 4:01

11

Đã trả lời ngày 9 tháng 6 năm 2010 lúc 4:51Jun 9, 2010 at 4:51

Lemonlemonlemon

9.0157 Huy hiệu vàng37 Huy hiệu bạc45 Huy hiệu Đồng7 gold badges37 silver badges45 bronze badges

7

Dưới đây là một mẫu mã sạch hơn về một cách tốt để có được địa chỉ IP của người dùng.

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);

Dưới đây là phiên bản ngắn hơn sử dụng toán tử Elvis:

$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);

Dưới đây là phiên bản sử dụng ISSET để xóa thông báo (cảm ơn bạn, @shasi Kanth):

$ip = isset($_SERVER['HTTP_CLIENT_IP']) 
    ? $_SERVER['HTTP_CLIENT_IP'] 
    : (isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
      ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
      : $_SERVER['REMOTE_ADDR']);

Đã trả lời ngày 8 tháng 10 năm 2014 lúc 16:20Oct 8, 2014 at 16:20

josh223a123josh223a123josh223a123

1.9631 Huy hiệu vàng12 Huy hiệu bạc21 Huy hiệu đồng1 gold badge12 silver badges21 bronze badges

16

Nó nên được chứa trong biến

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4.

JJJ

32.5K20 Huy hiệu vàng88 Huy hiệu bạc102 Huy hiệu Đồng20 gold badges88 silver badges102 bronze badges

Đã trả lời ngày 11 tháng 9 năm 2008 lúc 3:38Sep 11, 2008 at 3:38

Kyle Croninkyle CroninKyle Cronin

76.3K42 Huy hiệu vàng148 Huy hiệu bạc163 Huy hiệu đồng42 gold badges148 silver badges163 bronze badges

Giải pháp yêu thích của tôi là cách Zend Framework 2 sử dụng. Nó cũng xem xét các thuộc tính

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
4
$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
5,
$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
6,
$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
7 nhưng nó tuyên bố một lớp để đặt một số proxy đáng tin cậy và nó trả về một địa chỉ IP không phải là một mảng. Tôi nghĩ rằng đây là giải pháp gần nhất với nó:

class RemoteAddress
{
    /**
     * Whether to use proxy addresses or not.
     *
     * As default this setting is disabled - IP address is mostly needed to increase
     * security. HTTP_* are not reliable since can easily be spoofed. It can be enabled
     * just for more flexibility, but if user uses proxy to connect to trusted services
     * it's his/her own risk, only reliable field for IP address is $_SERVER['REMOTE_ADDR'].
     *
     * @var bool
     */
    protected $useProxy = false;

    /**
     * List of trusted proxy IP addresses
     *
     * @var array
     */
    protected $trustedProxies = array();

    /**
     * HTTP header to introspect for proxies
     *
     * @var string
     */
    protected $proxyHeader = 'HTTP_X_FORWARDED_FOR';

    // [...]

    /**
     * Returns client IP address.
     *
     * @return string IP address.
     */
    public function getIpAddress()
    {
        $ip = $this->getIpAddressFromProxy();
        if ($ip) {
            return $ip;
        }

        // direct IP address
        if (isset($_SERVER['REMOTE_ADDR'])) {
            return $_SERVER['REMOTE_ADDR'];
        }

        return '';
    }

    /**
     * Attempt to get the IP address for a proxied client
     *
     * @see http://tools.ietf.org/html/draft-ietf-appsawg-http-forwarded-10#section-5.2
     * @return false|string
     */
    protected function getIpAddressFromProxy()
    {
        if (!$this->useProxy
            || (isset($_SERVER['REMOTE_ADDR']) && !in_array($_SERVER['REMOTE_ADDR'], $this->trustedProxies))
        ) {
            return false;
        }

        $header = $this->proxyHeader;
        if (!isset($_SERVER[$header]) || empty($_SERVER[$header])) {
            return false;
        }

        // Extract IPs
        $ips = explode(',', $_SERVER[$header]);
        // trim, so we can compare against trusted proxies properly
        $ips = array_map('trim', $ips);
        // remove trusted proxy IPs
        $ips = array_diff($ips, $this->trustedProxies);

        // Any left?
        if (empty($ips)) {
            return false;
        }

        // Since we've removed any known, trusted proxy servers, the right-most
        // address represents the first IP we do not know about -- i.e., we do
        // not know if it is a proxy server, or a client. As such, we treat it
        // as the originating IP.
        // @see http://en.wikipedia.org/wiki/X-Forwarded-For
        $ip = array_pop($ips);
        return $ip;
    }

    // [...]
}

Xem mã đầy đủ ở đây: https://raw.githubusercontent.com/zendframework/zend-http/master/src/phpenvironment/remoteaddress.php

Đã trả lời ngày 7 tháng 7 năm 2014 lúc 9:02Jul 7, 2014 at 9:02

Nhịp nhịp timalgorhythm

8.2822 Huy hiệu vàng34 Huy hiệu bạc46 Huy hiệu đồng2 gold badges34 silver badges46 bronze badges

4

Có nhiều loại người dùng khác nhau phía sau Internet, vì vậy chúng tôi muốn bắt địa chỉ IP từ các phần khác nhau. Những người đang có:

1.

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
4 - Điều này chứa địa chỉ IP thực của máy khách. Đó là giá trị đáng tin cậy nhất bạn có thể tìm thấy từ người dùng. - This contains the real IP address of the client. That is the most reliable value you can find from the user.

2.

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
9 - Điều này sẽ tìm nạp tên máy chủ mà người dùng đang xem trang hiện tại. Nhưng để tập lệnh này hoạt động, việc tra cứu tên máy chủ trên httpd.conf phải được cấu hình. - This will fetch the host name from which the user is viewing the current page. But for this script to work, hostname lookups on inside httpd.conf must be configured.

3.

$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);
0 - Điều này sẽ tìm nạp địa chỉ IP khi người dùng đến từ các dịch vụ Internet được chia sẻ. - This will fetch the IP address when the user is from shared Internet services.

4.

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
5 - Điều này sẽ lấy địa chỉ IP từ người dùng khi anh ấy/cô ấy đứng sau proxy. - This will fetch the IP address from the user when he/she is behind the proxy.

Vì vậy, chúng tôi có thể sử dụng chức năng kết hợp sau đây để có được địa chỉ IP thực từ những người dùng đang xem ở các vị trí khác nhau,

// Function to get the user IP address
function getUserIP() {
    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_X_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
    else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
    else if(isset($_SERVER['HTTP_FORWARDED']))
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
    else if(isset($_SERVER['REMOTE_ADDR']))
        $ipaddress = $_SERVER['REMOTE_ADDR'];
    else
        $ipaddress = 'UNKNOWN';
    return $ipaddress;
}

Đã trả lời ngày 29 tháng 12 năm 2016 lúc 15:18Dec 29, 2016 at 15:18

K.SuthagarK.SuthagarK.Suthagar

2.1481 Huy hiệu vàng15 Huy hiệu bạc28 Huy hiệu đồng1 gold badge15 silver badges28 bronze badges

1

Sau đây là phương pháp tiên tiến nhất mà tôi đã tìm thấy, và tôi đã thử một số người khác trong quá khứ. Nó có giá trị để đảm bảo lấy địa chỉ IP của khách truy cập (nhưng xin lưu ý rằng bất kỳ tin tặc nào cũng có thể làm sai lệch địa chỉ IP một cách dễ dàng).

function get_ip_address() {

    // Check for shared Internet/ISP IP
    if (!empty($_SERVER['HTTP_CLIENT_IP']) && validate_ip($_SERVER['HTTP_CLIENT_IP'])) {
        return $_SERVER['HTTP_CLIENT_IP'];
    }

    // Check for IP addresses passing through proxies
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {

        // Check if multiple IP addresses exist in var
        if (strpos($_SERVER['HTTP_X_FORWARDED_FOR'], ',') !== false) {
            $iplist = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            foreach ($iplist as $ip) {
                if (validate_ip($ip))
                    return $ip;
            }
        }
        else {
            if (validate_ip($_SERVER['HTTP_X_FORWARDED_FOR']))
                return $_SERVER['HTTP_X_FORWARDED_FOR'];
        }
    }
    if (!empty($_SERVER['HTTP_X_FORWARDED']) && validate_ip($_SERVER['HTTP_X_FORWARDED']))
        return $_SERVER['HTTP_X_FORWARDED'];
    if (!empty($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']) && validate_ip($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
        return $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
    if (!empty($_SERVER['HTTP_FORWARDED_FOR']) && validate_ip($_SERVER['HTTP_FORWARDED_FOR']))
        return $_SERVER['HTTP_FORWARDED_FOR'];
    if (!empty($_SERVER['HTTP_FORWARDED']) && validate_ip($_SERVER['HTTP_FORWARDED']))
        return $_SERVER['HTTP_FORWARDED'];

    // Return unreliable IP address since all else failed
    return $_SERVER['REMOTE_ADDR'];
}

/**
 * Ensures an IP address is both a valid IP address and does not fall within
 * a private network range.
 */
function validate_ip($ip) {

    if (strtolower($ip) === 'unknown')
        return false;

    // Generate IPv4 network address
    $ip = ip2long($ip);

    // If the IP address is set and not equivalent to 255.255.255.255
    if ($ip !== false && $ip !== -1) {
        // Make sure to get unsigned long representation of IP address
        // due to discrepancies between 32 and 64 bit OSes and
        // signed numbers (ints default to signed in PHP)
        $ip = sprintf('%u', $ip);

        // Do private network range checking
        if ($ip >= 0 && $ip <= 50331647)
            return false;
        if ($ip >= 167772160 && $ip <= 184549375)
            return false;
        if ($ip >= 2130706432 && $ip <= 2147483647)
            return false;
        if ($ip >= 2851995648 && $ip <= 2852061183)
            return false;
        if ($ip >= 2886729728 && $ip <= 2887778303)
            return false;
        if ($ip >= 3221225984 && $ip <= 3221226239)
            return false;
        if ($ip >= 3232235520 && $ip <= 3232301055)
            return false;
        if ($ip >= 4294967040)
            return false;
    }
    return true;
}

Đã trả lời ngày 29 tháng 1 năm 2015 lúc 14:37Jan 29, 2015 at 14:37

Manuelbcdmanuelbcdmanuelbcd

2.6801 Huy hiệu vàng23 Huy hiệu bạc37 Huy hiệu đồng1 gold badge23 silver badges37 bronze badges

6

Câu trả lời là sử dụng biến

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
4. Ví dụ:
$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);
3 sẽ trả về địa chỉ IP của khách hàng.

Tjhorner

3512 Huy hiệu bạc16 Huy hiệu Đồng2 silver badges16 bronze badges

Đã trả lời ngày 9 tháng 6 năm 2010 lúc 4:56Jun 9, 2010 at 4:56

Kainosnouskainosnouskainosnous

5583 Huy hiệu bạc5 Huy hiệu Đồng3 silver badges5 bronze badges

0

Một giải pháp nhanh (không có lỗi)

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
0

Hanshenrik

18.1k3 Huy hiệu vàng39 Huy hiệu bạc77 Huy hiệu đồng3 gold badges39 silver badges77 bronze badges

Đã trả lời ngày 23 tháng 6 năm 2019 lúc 8:04Jun 23, 2019 at 8:04

3

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
1

Hoặc phiên bản nén:

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
2

Đã trả lời ngày 20 tháng 5 năm 2019 lúc 13:58May 20, 2019 at 13:58

KeaserKeaserKeaser

3313 Huy hiệu bạc6 Huy hiệu Đồng3 silver badges6 bronze badges

Đây là một chút mã sẽ chọn IP hợp lệ bằng cách kiểm tra thông qua các nguồn khác nhau.

Đầu tiên, nó kiểm tra xem 'remote_addr' có phải là IP công cộng hay không (và không phải là một trong những proxy ngược đáng tin cậy của bạn), sau đó đi qua một trong các tiêu đề HTTP cho đến khi tìm thấy IP công cộng và trả về nó. (Php 5.2+)

Nó phải đáng tin cậy miễn là proxy ngược được tin cậy hoặc máy chủ được kết nối trực tiếp với máy khách.

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
3

Đã trả lời ngày 2 tháng 6 năm 2019 lúc 7:12Jun 2, 2019 at 7:12

ws-onows-onows-ono

1831 Huy hiệu bạc7 Huy hiệu đồng1 silver badge7 bronze badges

0

Như tất cả những người khác đã nói trước khi bạn có thể sử dụng

$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);
4 để lấy địa chỉ IP của máy khách.

Ngoài ra, nếu bạn cần thêm thông tin về người dùng, bạn có thể sử dụng điều này:

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
4

Thông tin cụ thể hơn của khách hàng có trong $ clientDetails. Bạn có thể tìm nạp các mục JSON được lưu trữ trong Biến $ clientDetails theo cách này: $ clientDetails-> PostalCode/hostName/cworge/loc ...
You can fetch JSON items stored in $clientDetails variable this way: $clientDetails->PostalCode/hostname/region/loc...

Tôi đang sử dụng ipinfo.io để có thêm thông tin.

Đã trả lời ngày 26 tháng 5 năm 2016 lúc 10:49May 26, 2016 at 10:49

SiamaksiamakSiamak

1.5891 Huy hiệu vàng16 Huy hiệu bạc25 Huy hiệu đồng1 gold badge16 silver badges25 bronze badges

Tôi thích mã này

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
5

Đã trả lời ngày 10 tháng 5 năm 2011 lúc 12:00May 10, 2011 at 12:00

4

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
6

Đã trả lời ngày 28 tháng 12 năm 2015 lúc 10:50Dec 28, 2015 at 10:50

7

Đây là phương pháp mà tôi sử dụng và nó xác thực đầu vào IPv4:

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
7

Đã trả lời ngày 13 tháng 2 năm 2014 lúc 14:47Feb 13, 2014 at 14:47

CARBONTWELVECARBONTWELVEcarbontwelve

1.0911 Huy hiệu vàng13 Huy hiệu bạc24 Huy hiệu đồng1 gold badge13 silver badges24 bronze badges

1

Chà, điều này có thể được thực hiện đơn giản bằng cách sử dụng biến

$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);
5 có tên là
$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
4.

$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
4 là một mảng có tên thuộc tính
$ip = $_SERVER['HTTP_CLIENT_IP'] 
   ? $_SERVER['HTTP_CLIENT_IP'] 
   : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
        ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
        : $_SERVER['REMOTE_ADDR']);
7.

Chỉ cần gán nó như thế này:

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
8

Hoặc sử dụng nó trực tiếp như

$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);
9 hoặc
$ip = isset($_SERVER['HTTP_CLIENT_IP']) 
    ? $_SERVER['HTTP_CLIENT_IP'] 
    : (isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
      ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
      : $_SERVER['REMOTE_ADDR']);
0.

Đã trả lời ngày 24 tháng 2 năm 2016 lúc 9:21Feb 24, 2016 at 9:21

Yash Kumar Vermayash Kumar VermaYash Kumar Verma

8.9672 Huy hiệu vàng16 Huy hiệu bạc28 Huy hiệu đồng2 gold badges16 silver badges28 bronze badges

Một trong số này :

$clientIp = "120.02.3.112";
$from = "1.02.1.112";
$to = "120.02.20.112";
9

Đã trả lời ngày 11 tháng 6 năm 2019 lúc 10:14Jun 11, 2019 at 10:14

SiesieSIE

1551 Huy hiệu bạc3 Huy hiệu đồng1 silver badge3 bronze badges

1

Chức năng này nhỏ gọn và bạn có thể sử dụng nó ở mọi nơi. Nhưng mà!

Đừng quên điều này! Trong loại chức năng hoặc khối mã này, không có bảo đảm ghi địa chỉ IP thực của người dùng vì một số người dùng có thể sử dụng proxy hoặc một cổng an toàn khác để được vô hình hoặc không thể theo dõi

Hàm PHP:

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
0

Usage:

$ip = isset($_SERVER['HTTP_CLIENT_IP']) 
    ? $_SERVER['HTTP_CLIENT_IP'] 
    : (isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
      ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
      : $_SERVER['REMOTE_ADDR']);
1 hoặc trực tiếp
$ip = isset($_SERVER['HTTP_CLIENT_IP']) 
    ? $_SERVER['HTTP_CLIENT_IP'] 
    : (isset($_SERVER['HTTP_X_FORWARDED_FOR']) 
      ? $_SERVER['HTTP_X_FORWARDED_FOR'] 
      : $_SERVER['REMOTE_ADDR']);
2

Đã trả lời ngày 19 tháng 6 năm 2016 lúc 0:09Jun 19, 2016 at 0:09

Ivan Barayevivan BarayevIvan Barayev

2.0075 huy hiệu vàng25 Huy hiệu bạc29 Huy hiệu đồng5 gold badges25 silver badges29 bronze badges

Đoạn mã nhận biết an toàn và cảnh báo đã nhận được địa chỉ IP:

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
1

Đã trả lời ngày 5 tháng 10 năm 2018 lúc 8:14Oct 5, 2018 at 8:14

Hàm sau xác định tất cả các khả năng và trả về các giá trị theo định dạng phân tách bằng dấu phẩy (IP, IP, v.v.).

Nó cũng có chức năng xác thực tùy chọn là (tham số đầu tiên bị vô hiệu hóa theo mặc định) để xác thực địa chỉ IP so với (phạm vi riêng và phạm vi dành riêng).

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
2

Đã trả lời ngày 27 tháng 4 năm 2016 lúc 1:28Apr 27, 2016 at 1:28

AkamakamAkam

99315 Huy hiệu bạc23 Huy hiệu đồng15 silver badges23 bronze badges

Thử cái này:

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
3

Đã trả lời ngày 26 tháng 5 năm 2015 lúc 10:49May 26, 2015 at 10:49

3

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
4

Thậm chí nhỏ hơn

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
5

Đã trả lời ngày 1 tháng 4 năm 2019 lúc 7:42Apr 1, 2019 at 7:42

Chỉ về điều này, và tôi ngạc nhiên rằng nó chưa được đề cập, là để có được địa chỉ IP chính xác của các trang web được nép mình phía sau cơ sở hạ tầng Cloudflare. Nó sẽ phá vỡ địa chỉ IP của bạn và cung cấp cho chúng tất cả các giá trị giống nhau. May mắn thay, họ cũng có một số tiêu đề máy chủ. Thay vì tôi viết lại những gì đã được viết, hãy xem ở đây cho một câu trả lời súc tích hơn, và vâng, tôi đã trải qua quá trình này một thời gian dài trước đây. https://stackoverflow.com/a/14985633/1190051

Đã trả lời ngày 29 tháng 4 năm 2019 lúc 4:51Apr 29, 2019 at 4:51

vr_drivervr_drivervr_driver

1.60724 Huy hiệu bạc36 Huy hiệu đồng24 silver badges36 bronze badges

Đây là một lớp lót đơn giản

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
6

EDIT:

Mã trên có thể trả về các địa chỉ dành riêng (như 10.0.0.1), danh sách địa chỉ của tất cả các máy chủ proxy trên đường, v.v. Để xử lý các trường hợp này, hãy sử dụng mã sau:

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
7

Đã trả lời ngày 16 tháng 11 năm 2016 lúc 18:15Nov 16, 2016 at 18:15

Oriadamoriadamoriadam

7.0592 Huy hiệu vàng43 Huy hiệu bạc46 Huy hiệu đồng2 gold badges43 silver badges46 bronze badges

Chức năng này nên hoạt động như mong đợi

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
8

Đã trả lời ngày 1 tháng 3 năm 2019 lúc 6:38Mar 1, 2019 at 6:38

Trong PHP, tùy chọn cuối cùng để có được IP công cộng phải luôn luôn là

$_SERVER['HTTP_CLIENT_IP'] 
   ? : ($_SERVER['HTTP_X_FORWARDED_FOR'] 
   ? : $_SERVER['REMOTE_ADDR']);
3 vì quá nhiều lý do bảo mật.

Dưới đây là một cách giải quyết để có được địa chỉ IP được xác thực của máy khách.

$clientIpArray = ["120","02","3","112"];
$fromArray = ["1","02","1","112"];
$toArray = ["120","02","20","112"];
9

Như bạn có thể thấy ở đây $ _Server ["Remote_addr"] là tùy chọn cuối cùng của chúng tôi cho IP. Sau khi nhận IP, chúng tôi cũng xác nhận IP để đảm bảo chất lượng và bảo mật.

Đã trả lời ngày 3 tháng 12 năm 2021 lúc 17:59Dec 3, 2021 at 17:59

Jerryurenaajerryurenaajerryurenaa

2.9531 Huy hiệu vàng19 Huy hiệu bạc15 Huy hiệu đồng1 gold badge19 silver badges15 bronze badges

Nếu bạn không thích sử dụng các câu lệnh if-eluse/switch, thì giải pháp sau là dành cho bạn.

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
0

Đã trả lời ngày 29 tháng 6 lúc 1:59Jun 29 at 1:59

Faraz Ahmadfaraz AhmadFaraz Ahmad

4351 Huy hiệu vàng5 Huy hiệu bạc13 Huy hiệu đồng1 gold badge5 silver badges13 bronze badges

Bạn có thể sử dụng chức năng bên dưới

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
1

Đã trả lời ngày 5 tháng 7 lúc 9:15Jul 5 at 9:15

Thích những điều sau đây?

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
2

PS

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
3

Tất cả các tiêu đề bắt đầu bằng 'http_' hoặc 'x-' có thể bị giả mạo, tương ứng là người dùng được xác định. Nếu bạn muốn theo dõi, sử dụng cookie, v.v.

Đã trả lời ngày 6 tháng 12 năm 2014 lúc 10:41Dec 6, 2014 at 10:41

B.F.B.F.B.F.

4596 Huy hiệu bạc9 Huy hiệu Đồng6 silver badges9 bronze badges

Làm cách nào để xác định vị trí địa chỉ IP của tôi?

Trên Android/Tablet, hãy truy cập cài đặt mạng WiFi của bạn, sau đó chọn mạng bạn được kết nối. Bạn sẽ tìm thấy địa chỉ IP của bạn cùng với thông tin mạng khác.Go to your Wifi network settings, then select the network you're connected to. You'll find your IP address along with the other network information.

Làm thế nào chúng ta có thể lấy địa chỉ IP của người dùng máy khách?

Hàm getenv (): Cách khác để lấy địa chỉ IP của máy khách đang sử dụng hàm getenv (). Nó được sử dụng để lấy giá trị của biến môi trường trong PHP. Để có được địa chỉ IP của người dùng, chúng tôi cần chuyển biến remote_addr cho hàm getenv (). getenv ("remote_addr");: The other way to get the IP address of the client is using the getenv() function. It is used to retrieve the value of an environment variable in PHP. To get the IP address of the user we need to pass the REMOTE_ADDR variable to the getenv() function. getenv("REMOTE_ADDR");

Máy chủ $ _ là gì ['remote_addr'] là gì?

$ _Server ['remote_addr'] trả về địa chỉ IP từ nơi người dùng đang xem trang hiện tại. $ _Server ['remote_host'] trả về tên máy chủ từ nơi người dùng đang xem trang hiện tại.Returns the IP address from where the user is viewing the current page. $_SERVER['REMOTE_HOST'] Returns the Host name from where the user is viewing the current page.