Każdy wie, skutecznej i bezpiecznej metody, aby zobaczyć, czy to wejście:Zoptymalizowana metoda porównywania adresów IP ze znakami wieloznacznymi w PHP?
$_SERVER['REMOTE_ADDR']
mecze przeciwko coś podobnego do tej tablicy filtrów niespójnych (zauważ, że 200.100 * * może być wyrażona jako tylko 200,100 *...) z symboli wieloznacznych oznaczonych * 's:
array(
'192.168.1.*',
'192.168.2.1*',
'10.0.0.*',
'200.100.*.*',
'300.200.*',
)
Aktualizuj
myśli?
foreach($instanceSettings['accessControl']['allowedIpV4Addresses'] as $ipV4Address) {
echo 'Now checking against '.$ipV4Address.'.';
// Compare each octet
$ipV4AddressOctets = String::explode('.', $ipV4Address);
$remoteIpV4AddressOctets = String::explode('.', $_SERVER['REMOTE_ADDR']);
$remoteIpV4AddressIsAllowed = true;
for($i = 0; $i < Arr::size($ipV4AddressOctets); $i++) {
echo 'Comparing '.$ipV4AddressOctets[$i].' against '.$remoteIpV4AddressOctets[$i].'.';
if($ipV4AddressOctets[$i] != $remoteIpV4AddressOctets[$i] && $ipV4AddressOctets[$i] != '*') {
echo 'No match.';
$remoteIpV4AddressIsAllowed = false;
break;
}
}
// Get out of the foreach if we've found a match
if($remoteIpV4AddressIsAllowed) {
break;
}
}
Czy można również określić maskę sieci dla każdego adresu IP? tj .: "192.168.100.251/26'" lub "192.168.100.251 '=>' 26'' (ta 26-bitowa maska może nie być nawet ważna dla podanego adresu IP, to tylko dla przykładu) Jeśli możesz określić maski sieci, to obliczanie trafności adresu IP jest tak proste jak 'if ($ first_addr_of_mask> $ ip && $ last_addr_of_mask <$ ip) ' – Oerd
Nie zrobiłbym tego w PHP, ale raczej na firewallu serwera. – hornetbzz