Uso ip2long()
para convertir decimal con puntos a una dirección IP real. Entonces puedes hacer rangos fácilmente.
Simplemente haga ip2long()
en el rango alto y bajo para obtener el valor, luego use esos como constantes en su código.
Si está familiarizado con el enmascaramiento de subred, puede hacerlo de esta manera:
// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$mask = ip2long("255.255.0.0");
$ip = ip2long($_SERVER['REMOTE_ADDR']);
if (($network & $mask) == ($ip & $mask)) {
die("Unauthorized");
}
O si usted está familiarizado con este formato 10.12.0.0/16
:
// Deny 10.12.*.*
$network = ip2long("10.12.0.0");
$prefix = 16;
$ip = ip2long($_SERVER['REMOTE_ADDR']);
if ($network >> (32 - $prefix)) == ($ip >> (32 - $prefix)) {
die("Unauthorized");
}
Usted puede convertirlas en funciones y tiene un código muy manejable, por lo que es fácil agregar direcciones IP y personalizar los rangos.
jeje, me sorprende que ' strpos' aquí funciona más rápido que 'substr' – zerkms
@zerkms no debería ser realmente sorprendente -' strpos' puede regresar inmediatamente si la prueba falla, y no tiene que ver cualquier copia o asignación de cadenas. Además, solo quería señalar que el comportamiento cambia si cambia '===' por '==', así que no haga eso. Usa tres signos iguales – gnud
@gnud: para strings largos strpos sería más lento, simplemente porque debería iterar sobre toda la cadena para buscar la aguja. y sé cuál es la diferencia de '===' y '=='. – zerkms