Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

php

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.


You can use this:

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

You can use inet_pton:

<?php

$packedIp = @inet_pton($ip);

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

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.


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

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


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

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