subredes - javascript ip address
JavaScript: ¿La IP está en una de estas subredes? (5)
Así que tengo ~ 12600 subredes:
p.ej. 123.123.208.0/20
y una IP.
Puedo usar una base de datos SQLite o una matriz o lo que sea
Hubo una pregunta similar acerca de hace un mes, sin embargo, no estoy buscando verificar una IP contra una subred sino un grupo de subredes (obviamente la forma más eficiente, con suerte no O (subredes totales)) :)
¿Cómo puedo verificar que la dirección IP sea una de estas subredes? Necesito verdadero o falso, no la subred, si eso ayuda a la optimización.
Hay subredes similares en la lista actual, por ejemplo .: (extracto real)
123.123.48.0/22 <-- not a typo
123.123.48.0/24 <-- not a typo
123.123.90.0/24
123.123.91.0/24
123.123.217.0/24
En total van desde 4.xyz a 222.xyz
Convierta la ip inferior y la ip superior en el rango en enteros y almacene el rango en la base de datos y luego asegúrese de que ambas columnas estén indexadas.
Fuera de mi cabeza (pseudo código):
function ipmap(w,x,y,z) {
return 16777216*w + 65536*x + 256*y + z;
}
var masks = array[ipmap(128,0,0,0), ipmap(196,0,0,0), ..., ipmap(255,255,255,255)]
function lowrange(w, x, y, z, rangelength) {
return ipmap(w, x, y, z) & masks[rangelength]
}
function hirange(w, x, y, z, rangelength) {
return lowrange(w, x, y, z, ,rangelength) + ipmap(255,255,255,255) - masks[rangelength];
}
Eso debería hacerlo.
Para encontrar si una determinada IP cae en alguno de los rangos, conviértala en un entero y haz lo siguiente:
SELECT COUNT(*) FROM ipranges WHERE lowrange <= 1234567 AND 1234567 <= highrange
El optimizador de consultas debería poder acelerarlo mucho.
El mejor enfoque es que la OMI haga uso de operadores bit a bit. Por ejemplo, 123.123.48.0/22
representa (123<<24)+(123<<16)+(48<<8)+0
(= 2071670784; este podría ser un número negativo) como una dirección IP numérica de 32 bits, y -1<<(32-22)
= -1024 como máscara. Con esto, y del mismo modo, su dirección IP de prueba convertida a un número, puede hacer:
(inputIP & testMask) == testIP
Por ejemplo, 123.123.49.123 está en ese rango, ya que 2071671163 & -1024
es 2071670784
Entonces, aquí hay algunas funciones de herramienta:
function IPnumber(IPaddress) {
var ip = IPaddress.match(/^(/d+)/.(/d+)/.(/d+)/.(/d+)$/);
if(ip) {
return (+ip[1]<<24) + (+ip[2]<<16) + (+ip[3]<<8) + (+ip[4]);
}
// else ... ?
return null;
}
function IPmask(maskSize) {
return -1<<(32-maskSize)
}
prueba:
(IPnumber(''123.123.49.123'') & IPmask(''22'')) == IPnumber(''123.123.48.0'')
cede true
.
En caso de que su máscara tenga el formato ''255.255.252.0'', entonces puede usar la función IPnumber para la máscara también.
Prueba esto:
var ip2long = function(ip){
var components;
if(components = ip.match(/^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$/))
{
var iplong = 0;
var power = 1;
for(var i=4; i>=1; i-=1)
{
iplong += power * parseInt(components[i]);
power *= 256;
}
return iplong;
}
else return -1;
};
var inSubNet = function(ip, subnet)
{
var mask, base_ip, long_ip = ip2long(ip);
if( (mask = subnet.match(/^(.*?)//(/d{1,2})$/)) && ((base_ip=ip2long(mask[1])) >= 0) )
{
var freedom = Math.pow(2, 32 - parseInt(mask[2]));
return (long_ip > base_ip) && (long_ip < base_ip + freedom - 1);
}
else return false;
};
Uso:
inSubNet(''192.30.252.63'', ''192.30.252.0/22'') => true
inSubNet(''192.31.252.63'', ''192.30.252.0/22'') => false
Logré resolver esto usando el módulo de máscara de red de nodos . Puede verificar si una IP pertenece a una subred haciendo algo como esto:
import { Netmask } from ''netmask''
const block = new Netmask(''123.123.208.0/20'')
const ip = ''123.123.208.0''
console.log(block.contains(ip))
Aquí se imprimirá true
.
Puedes instalarlo usando:
npm i --save netmask
Funciones IPnumber
y IPmask
son agradables, sin embargo, prefiero probar como:
(IPnumber(''123.123.49.123'') & IPmask(''22'')) == (IPnumber(''123.123.48.0'') & IPmask(''22''))
Porque para cada dirección, solo necesita tener en cuenta la parte de la red de la dirección. Por lo tanto, hacer IPmask(''22'')
pondrá a cero la parte de la computadora de la dirección y usted debe hacer lo mismo con la dirección de red.