Home » Php » php – How to know which version of the Internet Protocol (IP) a client is using when connecting to my server?

php – How to know which version of the Internet Protocol (IP) a client is using when connecting to my server?

Posted by: admin April 23, 2020 Leave a comment

Questions:

I want to check via php if someone connects to my site via IPv4 or IPv6.

The client address can be found in $_SERVER["REMOTE_ADDR"] but how to check if it’s IPv4 or IPv6 ?

How to&Answers:

Check for IPv4

$ip = "255.255.255.255";
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {    
    echo "Valid IPv4";
}
else {
    echo "Invalid IPv4";
}

Check for IPv6

$ip = "FE80:0000:0000:0000:0202:B3FF:FE1E:8329";    
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
    echo "Valid IPv6";
}
else {
    echo "Invalid IPv6";
}

For more, check PHP function filter_vars and list of filters for validation.

Answer:

You can use this:

function ipVersion($txt) {
     return strpos($txt, ":") === false ? 4 : 6;
}

Answer:

You can use inet_pton:

<?php

$packedIp = @inet_pton($ip);

if ($packedIp === false) {
    // invalid IP
} else if (isset($packedIp[4])) {
    // IPv6
} else {
    // IPv4
}

Answer:

What about counting the number of '.' and/or ‘:‘ in $_SERVER["REMOTE_ADDR"] ?

If there is more than 0 ‘:‘, and no ‘.‘ symbol in $_SERVER["REMOTE_ADDR"], I suppose you can consider you user is connected via IPv6.

Another solution might be to use the filter extension : there are constants (see the end of the page) that seem to be related to IPv4 and IPv6 :

FILTER_FLAG_IPV4 (integer)
Allow
only IPv4 address in “validate_ip”
filter.

FILTER_FLAG_IPV6 (integer)
Allow
only IPv6 address in “validate_ip”
filter.

Answer:

Since the highest voted answer has a rather significant problem, I’m going to share my own.

This returns true if an address which appears to be IPv6 is passed in, and false if an address which appears to be IPv4 (or IPv4-mapped IPv6) is passed in. The actual addresses are not further validated; use filter_var() if you need to validate them.

function is_ipv6($address) {
    $ipv4_mapped_ipv6 = strpos($address, "::ffff:");
    return (strpos($address, ":") !== FALSE) &&
           ($ipv4_mapped_ipv6 === FALSE || $ipv4_mapped_ipv6 != 0);
}

Answer:

IPv4 addresses all match the regex /^\d{1,3}(\.\d{1,3}){3,3}$/.

Answer:

You can use AF_INET6 to detect if PHP is compiled with IPv6 support:

<?php
if ( defined('AF_INET6') ) {
    echo 'Yes';
} else {
    echo 'No';
}
?>