Handle IPv4-mapped IPv6 addresses

This commit is contained in:
Steffen Lange 2019-06-05 16:08:56 +02:00
parent e789890950
commit fa704bcdec

View file

@ -1,20 +1,34 @@
<?php
function unmask_ipv4($addr) {
$prefix = '00000000000000000000ffff';
$prefix_bin = hex2bin($prefix);
if (($addr_bin = inet_pton($addr)) === FALSE)
return false;
if (substr($addr_bin, 0, strlen($prefix_bin)) == $prefix_bin)
$addr_bin = substr($addr_bin, strlen($prefix_bin));
return inet_ntop($addr_bin);
}
ini_set('default_charset', 'iso-8859-1');
header('Content-Type: text/plain');
$ip = $_SERVER['REMOTE_ADDR'];
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
if ($ip = unmask_ipv4($_SERVER['REMOTE_ADDR'])) {
$cmd = isset($_GET['cmd']) ? $_GET['cmd'] : '';
if ($cmd === 'long') {
printf('%u', ip2long($ip));
}
elseif ($cmd === 'hostname') {
echo gethostbyaddr($ip);
}
else {
echo $ip;
switch ($cmd) {
case 'long':
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
printf('%u', ip2long($ip));
else
echo $ip;
break;
case 'host':
case 'hostname':
echo gethostbyaddr($ip);
break;
default:
echo $ip;
}
}
else {
echo $ip;
echo 'Invalid IP address';
}
?>