Ceci est dans le cas où vous décidez d'aller avec mon commentaire, en vous suggérant de ne pas utiliser d'expressions rationnelles. Non testé (mais probablement fonctionne, ou au moins proche), en Perl:
@private = (
{network => inet_aton('127.0.0.0'), mask => inet_aton('255.0.0.0') },
{network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
# ...
);
$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
# ip address is private
} else {
# ip address is not private
}
Notez maintenant comment @private
est juste des données, que vous pouvez facilement changer. Ou télécharger à la volée à partir du Cymru Bogon Reference. Edit: Il me vient à l'esprit que demander une regexp Perl ne signifie pas que vous connaissez Perl, donc la ligne clé est le 'grep', qui boucle simplement sur chaque plage d'adresses privée. Vous prenez votre IP, bitwise et avec le masque de réseau, et comparez à l'adresse réseau. Si égal, sa partie de ce réseau privé.
Tout d'abord, vous devez examiner RFC1918 pour obtenir la bonne liste. Deuxièmement, je suggère qu'une solution n'impliquant pas les expressions rationnelles sera plus facile à maintenir. Une fois que vous avez converti une adresse IP en numérique, il est assez facile de la faire correspondre à une liste de plages IP privées. Cela vous permettra également d'utiliser facilement les listes de bogons disponibles publiquement, qui contiennent beaucoup plus que RFC1918. – derobert
@derobert true, mais pour des utilisations telles qu'un filtre d'adresse distant Tomcat, vous avez besoin d'une expression régulière. – Raedwald
C'est une erreur courante de débutant de penser que '^' signifie "non" dans ce contexte, donc il convient de souligner: Chaque '^' dans votre expression ancre simplement la correspondance au début de la ligne. Dans la regex traditionnelle, il n'y a pas de moyen simple de dire "pas cette chaîne", bien que les expressions Perl-compatibles/PCRE aient des lookaheads négatifs avec '(?! ...)' – tripleee