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
You can use this:
function ipVersion($txt) {
return strpos($txt, ":") === false ? 4 : 6;
}
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.
You can use AF_INET6
to detect if PHP is compiled with IPv6 support:
<?php
if ( defined('AF_INET6') ) {
echo 'Yes';
} else {
echo 'No';
}
?>
You can use inet_pton
:
<?php
$packedIp = @inet_pton($ip);
if ($packedIp === false) {
// invalid IP
} else if (isset($packedIp[4])) {
// IPv6
} else {
// IPv4
}
IPv4 addresses all match the regex /^\d{1,3}(\.\d{1,3}){3,3}$/
.
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.