Notre serveur Web Microsoft IIS est configuré pour accepter les connexions IPv4 et, depuis 1996, nous enregistrons les adresses IP dans des bases de données à l'aide de VARCHAR(15). Nous n'avons pas été touchés en 2012 lorsque l'ARIN et la Journée mondiale de lancement d'IPv6 ont introduit les nouvelles adresses IP IPv6, car IPv6 n'est pas activé sur notre réseau. Toutes les adresses IP entrantes au cours des 28 dernières années étaient toutes IPv4.
Au fil des années, nous avons fait appel à certains fournisseurs de cloud tiers prenant en charge IPv6 et leurs journaux contiennent des adresses IPv6. Je crois que SendGrid, StackPath, Edgio et Fastly enregistrent tous l'adresse IPv6. (SendGrid a un ancien article de 2016 intitulé « Où est IPv6 dans le courrier électronique ? » concernant son utilisation avec SMTP.)
Bien que le trafic IPv6 vers nos serveurs soit transmis par proxy via notre fournisseur WAF basé sur le cloud, nous pouvons accéder à l'IP IPv6 via l'en-tête HTTP Forwarded-For. Cela signifie que l'adresse IPv4 disponible via CGI.REMOTE_ADDR appartient à notre fournisseur WAF et ne doit pas être utilisée pour le blocage ou la journalisation. L'IPv6 doit être explicitement récupéré à partir des en-têtes HTTP à l'aide de getHttpRequestData(false). Si nous devons le stocker sous forme de chaîne dans la base de données, cela nécessitera un type de données VARCHAR(45).
Ben Nadel a partagé un article en 2018 intitulé "Vérifier si une adresse IP v4 est dans une plage CIDR à l'aide de ColdFusion et SubnetUtils" dans lequel il a converti les adresses IPv4 en nombre entier à l'aide de java.net.InetAddress et java.math.BigInteger. cours java. La logique de son UDF ipAddressToInt nous a permis d'ajouter facilement l'INT à notre base de données pour une recherche plus rapide sans chaîne, mais lorsqu'elle est utilisée avec une adresse IP IPv6, la "chaîne" java BIGINT dépassait les limites autorisées pour un SQL BIGINT.
MSSQL BIGINT Max :9 223 372 036 854 775 808 (et valeurs négatives)
ipAddressToInt("2a0d:5600:5b:9001:f6a4:817c:3bc6:2647"); // 55896819969464025771364933405273105991
Java BIGINT String : 55 896 819 969 464 025 771 364 933 405 273 105 991 (Whoa !)
En raison de la plage SQL limitée pour BIGINT, nous avons décidé de stocker une représentation des chaînes IPv4 et IPv6 en utilisant BINARY(16). Cela devrait accélérer l'indexation et les recherches.
Une solution de conversion de chaîne en binaire et inverse via StackOverflow fonctionne bien pour la conversion, mais elle nécessite d'accéder à la base de données distante afin d'effectuer une conversion qui doit être effectuée localement.
J'ai également essayé d'utiliser l'IA pour écrire une fonction permettant de convertir IPv4 et IPv6 en binaire, mais elle n'arrêtait pas d'halluciner, utilisait de fausses fonctions et ne pouvait pas fonctionner. (Il n'arrêtait pas d'insister sur le fait que padLeft() était une fonction CF. C'était un échec total à ce stade.)
Je ne voulais pas avoir de surcharge supplémentaire ou devenir dépendant d'une connexion Microsoft SQL Server pour les conversions IP. Une courte recherche a révélé IPAddress, une « bibliothèque Java pour gérer les adresses IP et les sous-réseaux, à la fois IPv4 et IPv6 ». Je pensais que c'était une valeur sûre car la bibliothèque est utilisée par de nombreuses entreprises comme Akamai, Amazon, Atlassian, AT&T, Cisco, Citibank, Comcast, Disney, Dell, Evernote, Google, Hulu, Netflix, Oracle, Proton-VPN, etc. . Cela ne me dérange pas d'utiliser Java tiers pour étendre ColdFusion et cette bibliothèque semble pouvoir exécuter de nombreuses fonctions liées à la propriété intellectuelle qui n'existent pas actuellement. La méthode toNormalizedString() est extrêmement bénéfique et sera utilisée pour enregistrer les adresses IP avec un formatage cohérent.
Voici quelques utilisations de base de CFML à l'aide de la classe IPAddress IPAddressString :
ipAddressString = createobject("java", "inet.ipaddr.IPAddressString"); ip = ipAddressString.init("2a0d:5600:5b:9001:f6a4:817c:3bc6:2647"); ipData = [ "isValid": ip.isValid(), "isIPAddress": ip.isIPAddress(), "isLoopback": ip.isLoopback(), "isIPv4": ip.isIPv4(), "isIPv6": ip.isIPv6(), "isMixedIPv6": ip.isMixedIPv6(), "toNormalizedString": ip.toNormalizedString() ]; writedump(var=ipData, label=ip);
https://gist.github.com/JamoCA/0e638da6927d341ed61e411f5789b4ec
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!