2017-09-13 5 views
0

donné S'il vous plaît pardon pour cette question trivalComment vérifier si une adresse IP donnée se situe entre une plage d'adresses IP nœud à l'aide js

Étant donné un ensemble de Ip l'ensemble est assez grand et pourrait augmenter https://github.com/client9/ipcat/blob/master/datacenters.csv#L4

Petit exemple set - premier ip début de seconde colonne - plage d'adresses IP de fin

enter image description here

Je vais obtenir le IP de l'utilisateur des reques t. J'ai besoin de vérifier si l'IP tombe dans cet ensemble de gammes. Comment puis-je accomplir cela.

J'ai examiné ip_range_check et range_check.

Mais ils ne vérifient pas pour une portée donnée donnée ip. Comment est-ce possible dans le nœud js avec les meilleures performances. Je ne veux pas aller chercher une recherche exhaustive car la performance est une priorité.

S'il vous plaît aider quelque chose de nouveau et assez difficile jusqu'à présent pour moi.

+0

Cela peut ne pas être le moyen le plus optimal. Mais je vous suggère de convertir les plages d'adresses IP en CIDR puis utilisez ip_range_check pour vérifier si une adresse IP appartient au CIDR. Je crois que vous pouvez utiliser [rangecalc] (https://www.npmjs.com/package/rangecalc) pour convertir les plages en CIDR. – Deja

+0

@Deja un petit exemple sera vraiment apprécié. Merci – INFOSYS

Répondre

4

Ceci est assez facile si nous convertissons les ips à des nombres simples:

function IPtoNum(ip){ 
    return Number(
    ip.split(".") 
     .map(d => ("000"+d).substr(-3)) 
     .join("") 
); 
} 

Ensuite, nous pouvons vérifier une certaine gamme comme:

if(IPtoNum(min) < IPtoNum(val) && IPtoNum(max) > IPtoNum(val)) alert("in range"); 

qui peut également être appliquée à une table:

const ranges = [ 
    ["..41", "192.168.45"], 
    ["123.124.125"," 126.124.123"] 
]; 

const ip = "125.12.125"; 
const inRange = ranges.some(
    ([min,max]) => IPtoNum(min) < IPtoNum(ip) && IPtoNum(max) > IPtoNum(ip) 
); 
+0

Merci pour cette réponse mais en tenant compte de la grande ip sera-t-il rapide ou donnera-t-il un bon performance de l'IP, nous devons vérifier réside au bas de la table – INFOSYS

+0

@infosys on pourrait l'optimiser en convertissant la table de IPS en nombre une fois. (et je pense que d'autres optimisations nécessitent une grande consommation de mémoire) Et jetez un oeil aux * filtres bloom *, ils pourraient faire ce que vous cherchez. –

+0

Merci, je vais convertir IP à des numéros pas un problème que cette fonction ne sera pas nécessaire, mais ce qui est bloom filtre comment l'ajouter à cela et rechercher? Je vais voter la réponse et l'accepter aussi – INFOSYS

2
//Use getCIDR from rangecalc 
getCIDR("5.9.0.0", "5.9.255.255") 
//This return 5.9.0.0/16 

//You can then use ipRangeCheck from ip_range_check 
ipRangeCheck("IP TO BE CHECKED", "5.9.0.0/16") 
//returns true or false 

Assez sûr qu'il existe une autre façon de procéder.

+0

Cela fonctionnerait mais cela sera exhaustif comme la force brute. Quelque chose de plus sage de la performance sera mieux car nous avons une énorme gamme d'IP que vous pensez. Encore une solution néanmoins – INFOSYS

+0

Cela peut être utile [iptrie] (https://github.com/postwait/node-iptrie) – Deja