web-dev-qa-db-fra.com

Identifiant d'adresse IP privée dans une expression régulière

Je me demande si c'est le meilleur moyen de faire correspondre une chaîne commençant par une adresse IP privée (Regex, de style Perl)

(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1])

Merci beaucoup!

29
caseyamcl

Je suppose que vous voulez faire correspondre ces gammes:

 127. 0.0.0 - 127.255.255.255 127.0.0.0 /8
 10. 0.0.0 - 10.255.255.255 10.0.0.0 /8
172. 16.0.0 - 172. 31.255.255 172.16.0.0 /12
192.168.0.0 - 192.168.255.255 192.168.0.0 /16

Il vous manque quelques points qui le feraient accepter par exemple 172.169.0.0 même si cela ne devrait pas être accepté. Je l'ai corrigé ci-dessous. Supprimez les nouvelles lignes, c'est juste pour la lisibilité.

(^127\.)|
(^10\.)|
(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|
(^192\.168\.)

Notez également que cela suppose que les adresses IP ont déjà été validées - cela accepte des choses comme 10.foobar.

51
Mark Byers

Ceci est identique à la réponse correcte de Mark, mais inclut désormais les adresses privées IPv6.

/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/
16
Edward

J'ai généré cela

REGEXP POUR LES RÉSEAUX DE CLASSE A: 

(10)(\.([2]([0-5][0-5]|[01234][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}

REGEXP POUR LES RÉSEAUX DE CLASSE B: 

(172)\.(1[6-9]|2[0-9]|3[0-1])(\.([2][0-5][0-5]|[1][0-9][0-9]|[1-9][0-9]|[0-9])){2}

REGEXP POUR LES RÉSEAUX DE CLASSE C: 

(192)\.(168)(\.[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]){2}

Faites-moi savoir si vous rencontrez une erreur

Si vous êtes sûr de votre résultat (par exemple, netstat) et que vous n'avez pas besoin de vérifier la validité de l'adresse IP car c'est déjà fait, vous pouvez capturer des adresses IP privées avec cette formule

grep -P "(10. | 192.168 | 172.1 [6-9]. | 172.2 [0-9]. | 172.3 [01].). *"

9
user3177026

C'est dans le cas où vous décidez d'y aller avec mon commentaire, suggérant de ne pas utiliser les expressions rationnelles. Non testé (mais fonctionne probablement, ou du 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 ne sont que des données, que vous pouvez facilement modifier. Ou télécharger à la volée à partir de Référence Cymru Bogon .

edit: Je me rends compte que demander une expression rationnelle Perl ne signifie pas que vous connaissez Perl, la ligne de clé est le 'grep', qui passe en boucle sur chaque plage d'adresses privée. Vous prenez votre adresse IP, bit à bit et avec le masque de réseau, et vous la comparez à l'adresse réseau. Si égal, sa partie de ce réseau privé.

3
derobert

Ça a l'air bien. Personnellement, je changerais le premier en:

^127\.0 

Avec ceci: (^127\.0\.0\.1) vous cherchez quelque chose qui commence par 127.0.0.1 et manquera 127.0.0.2*, 127.0.2.*, 127.0.* etc. 

3
KM.

Si vous recherchez system.net defaultProxy et proxy bypasslist config qui utilise un proxy pour externe mais utilise des connexions directes pour les hôtes internes (peut être fait avec un support ipv6) ...

<system.net>
  <defaultProxy enabled="true">
    <proxy proxyaddress="http://proxycluster.privatedomain.net:8080" bypassonlocal="True"  />
    <bypasslist>
      <!-- exclude local Host -->
      <add address="^(http|https)://localhost$" />
      <!-- excludes *.privatedomain.net -->
      <add address="^(http|https)://.*\.privatedomain\.net$" />
      <!-- excludes simple Host names -->
      <add address="^(http|https)://[a-z][a-z0-9\-_]*$" />
      <!-- exclude private network addresses 192.168, 172.16..31 through 31, 127.* etc. -->
      <add address="^(http|https)://((((127)|(10))\.[0-9]+\.[0-9]+\.[0-9]+)|(((172\.(1[6-9]|2[0-9]|3[0-1]))|(192\.168))\.[0-9]+\.[0-9]+))$"/>
    </bypasslist>
  </defaultProxy>
  <connectionManagement>
    <add address="*" maxconnection="10" />
  </connectionManagement>
</system.net>
1
Mhano

voici ce que j'utilise en python:

rfc1918 = re.compile('^(10(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){3}|((172\.(1[6-9]|2[0-9]|3[01]))|192\.168)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){2})$')

Vous pouvez supprimer les ancres ^ et/ou $ si vous le souhaitez.

Je préfère la regex ci-dessus parce qu'elle supprime les octets non valides (plus de 255).

exemple d'utilisation:

if rfc1918.match(ip):
    print "ip is private"
1
Josh Worley
     //RegEx to check for the following ranges. IPv4 only
         //172.16-31.xxx.xxx
         //10.xxx.xxx.xxx
         //169.254.xxx.xxx
         //192.168.xxx.xxx

     var regex = /(^127\.)|(^(0)?10\.)|(^172\.(0)?1[6-9]\.)|(^172\.(0)?2[0-9]\.)|(^172\.(0)?3[0-1]\.)|(^169\.254\.)|(^192\.168\.)/;
0