当社の Microsoft IIS Web サーバーは IPv4 接続を受け入れるように構成されており、1996 年以来、VARCHAR(15) を使用してデータベースに IP を記録してきました。 2012 年の ARIN および World IPv6 Launch Day で新しい IPv6 IP アドレスが導入されたとき、当社のネットワークでは IPv6 が有効になっていなかったため、当社は影響を受けませんでした。過去 28 年間の受信 IP はすべて IPv4 でした。
私たちは長年にわたり、IPv6 をサポートするいくつかのサードパーティ クラウド プロバイダーを利用してきました。そのログには IPv6 アドレスが含まれています。 SendGrid、StackPath、Edgio、Fastly はすべて IPv6 アドレスをログに記録していると思います。 (SendGrid には、SMTP での IPv6 の使用に関する「Where is IPv6 in Email?」というタイトルの 2016 年の古い記事があります。)
サーバーへの IPv6 トラフィックはクラウドベースの WAF プロバイダーを介してプロキシされますが、Forwarded-For HTTP ヘッダーを介して IPv6 IP にアクセスできます。これは、CGI.REMOTE_ADDR 経由で利用可能な IPv4 アドレスが WAF プロバイダーに属しており、ブロックやログ記録に使用すべきではないことを意味します。 IPv6 は、getHttpRequestData(false) を使用して HTTP ヘッダーから明示的に取得する必要があります。 データベースに文字列として保存する必要がある場合は、VARCHAR(45) データ型が必要です。
Ben Nadel は、2018 年に「ColdFusion と SubnetUtils を使用して IP v4 アドレスが CIDR 範囲内にあるかどうかを確認する」というタイトルの記事を共有し、そこで java.net.InetAddress と java.math.BigInteger を使用して IPv4 アドレスを整数に変換しました。 Java クラス。 彼の ipAddressToInt UDF のロジックにより、文字列以外の検索を高速化するためにデータベースに INT を追加することが簡単になりましたが、IPv6 IP アドレスで使用すると、Java BIGINT の「文字列」が SQL BIGINT の許容制限を超えてしまいました。
MSSQL BIGINT Max: 9,223,372,036,854,775,808 (および負の値)
ipAddressToInt("2a0d:5600:5b:9001:f6a4:817c:3bc6:2647"); // 55896819969464025771364933405273105991
Java BIGINT 文字列: 55,896,819,969,464,025,771,364,933,405,273,105,991 (おお!)
BIGINT の SQL 範囲が制限されているため、BINARY(16) を使用して IPv4 および IPv6 文字列の表現を格納することにしました。これにより、インデックス作成と検索が高速化されるはずです。
StackOverflow を介した文字列からバイナリへの変換および逆変換ソリューションは変換にはうまく機能しますが、ローカルで実行する必要がある変換を実行するにはリモート データベースにアクセスする必要があります。
AI を使用して IPv4 と IPv6 をバイナリに変換する関数を作成しようとしましたが、幻覚が続いて偽の関数が使用され、配信できませんでした。 (padLeft() が CF 関数であると主張し続けました。この時点では完全に失敗でした。)
余分なオーバーヘッドが発生したり、IP 変換のために Microsoft SQL Server 接続に依存したりしたくありませんでした。簡単な検索で、「IPv4 と IPv6 の両方の IP アドレスとサブネットを処理するための Java ライブラリ」である IPAddress が見つかりました。このライブラリは、Akamai、Amazon、Atlassian、AT&T、Cisco、Citibank、Comcast、Disney、Dell、Evernote、Google、Hulu、Netflix、Oracle、Proton-VPN などの多くの企業によって使用されているため、これは安全な賭けだと考えました。 ColdFusion を拡張するためにサードパーティの Java を使用することは気にせず、このライブラリは現在存在しない多くの IP 関連の機能を実行できるようです。 toNormalizedString() メソッドは非常に有益であり、一貫した形式で IP をログに記録するために使用されます。
IPAddress IPAddressString クラスを使用した基本的な CFML の使用法をいくつか示します。
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
以上がColdFusion で IPAddress Java ライブラリを使用して IPvamp を標準化する。 IPvアドレスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。