首頁  >  文章  >  Java  >  使用 IPAddress Java 函式庫和 ColdFusion 來標準化 IPvamp; IPv位址

使用 IPAddress Java 函式庫和 ColdFusion 來標準化 IPvamp; IPv位址

DDD
DDD原創
2024-11-24 21:30:47590瀏覽

Using IPAddress Java Library with ColdFusion to Standardize IPvamp; IPvddresses

我們的 Microsoft IIS Web 伺服器已配置為接受 IPv4 連接,自 1996 年以來,我們已使用 VARCHAR(15) 在資料庫中記錄 IP。 2012 年,當 ARIN 和世界 IPv6 發布日推出新的 IPv6 IP 位址時,我們沒有受到影響,因為我們的網路未啟用 IPv6。過去 28 年所有傳入 IP 均為 IPv4。

多年來,我們利用了一些支援 IPv6 的第三方雲端供應商,他們的日誌包含 IPv6 位址。我相信 SendGrid、StackPath、Edgio 和 Fastly 都會記錄 IPv6 位址。 (SendGrid 有一篇 2016 年的舊文章,題為“電子郵件中的 IPv6 在哪裡?”,介紹瞭如何將其與 SMTP 一起使用。)

雖然到我們伺服器的 IPv6 流量是透過我們基於雲端的 WAF 供應商代理的,但我們可以透過 Forwarded-For HTTP 標頭存取 IPv6 IP。這表示可透過 CGI.REMOTE_ADDR 取得的 IPv4 位址屬於我們的 WAF 供應商,不應用於封鎖或記錄。 必須使用 getHttpRequestData(false) 從 HTTP 標頭明確取得 IPv6。 如果我們需要將其作為字串儲存在資料庫中,則需要 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 最大值: 9,223,372,036,854,775,808 (和負值)

ipAddressToInt("2a0d:5600:5b:9001:f6a4:817c:3bc6:2647"); // 5589681996946402577136493340527310591

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 函數。此時它完全失敗了。)

我不想有額外的開銷或依賴 Microsoft SQL Server 連線進行 IP 轉換。簡短的搜尋發現了 IPAddress,一個「用於處理 IP 位址和子網路(IPv4 和 IPv6)的 Java 庫」。我認為這是一個安全的選擇,因為該庫被許多公司使用,例如Akamai、Amazon、Atlassian、AT&T、Cisco、Citibank、Comcast、Disney、Dell、Evernote、Google、Hulu、Netflix、Oracle、Proton-VPN 等我不介意使用第三方Java來擴充ColdFusion,而這個函式庫看起來可以執行許多目前不存在的與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

<script></script>

以上是使用 IPAddress Java 函式庫和 ColdFusion 來標準化 IPvamp; IPv位址的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn