Java的URL.equals()方法竟然執行DNS解析| 駭客新聞
DNS解析是一個非常耗時且容易失敗且容易受到攻擊的過程,在Java的URL的equslas()方法竟然執行DNS解析,這個方法主要是判斷兩個URL是否等同,主要依據:
1. 如果兩個URL物件具有相同的協議,引用等效的主機,在主機上具有相同的埠號以及相同的檔案和檔案片段,則它們是相等的。
2. 如果兩個主機名都可以解析為相同的IP地址,則認為這兩個主機等效。
這在HN引起很多討論,有人奇怪為什麼要URL解決任何問題?URL只是一個字串,這應該只是在進行字串比較。URL物件的所有部分都是字串或整數,因此在最壞的情況下,它們應該只是單獨比較所有這些內容,而不是解析域並比較IP地址。那根本沒有道理。
這可能與當時名稱解析在Sun內部的工作方式有關。
doppio.eng.sun.com
在工程(“ eng.sun.com”)域內,它簡稱為“ doppio”,在Sun內部的其他域中,則簡稱為“ doppio.eng”。在Sun內部使用FQDN引用Sun內部的其他主機是非常罕見的。因此,以下URL都引用相同的資源:
http://doppio/foo.html
http://doppio.eng/foo.html
http://doppio.eng.sun.com/foo.html
URL.equals()對於以上兩個URL中的任何一個都報告為true是一種合理的觀點。(但是,這並不意味著我認為這是一個好主意。)
從某種意義上說,Java和Windows一樣好,因為它的標準庫和API集非常穩定,並且支援許多舊版軟體。鑑於將近18年前在JDK 1.4中引入了URI類,因此我現在懷疑在新程式碼中是否確實需要URL類。儘管有很多依賴關係,所以URL可能會永遠保留在核心庫中,但是URI代表URL的超集,具有equals / hashCode的合理實現,並且足以滿足大多數用途。
不過,URL類還是用於建立與資源的實際連線。
這在equals定義的這種行為與HTTP中的虛擬主機不一致。不過,此功能於1995年引入,那是還沒有虛擬主機。
如果我的DNS解析器使用輪詢並在每個請求上返回不同的IP怎麼辦?因為現在很多大的域名都有動態解析,每次DNS解析獲得的IP不同。
這個功能看起來像是有太多時間的開發人員決定新增一些巨大的副作用。
這是很有趣,如果“ url..com”和“ url2.com”兩個不同域名都解析為相同的IP,則它們在功能上是相同的。這就像比較兩個字串,它們的變數名不同,但解析為記憶體中的相同空間。這也意味著,如果一個URL發生更改,則有時它們可以相等,而其他URL則不相等。
equals()和hashCode()可能是Java的最弱點之一。不同的用例將需要不同的等同定義。如果物件具有相同的標識,是否相等?如果它們具有相同的資料?如果他們決心解決同一件事?使其簡單地實現起來很容易,但是問題是缺少標準的庫支援,無法為map和集合提供自定義的雜湊和相等函式。(banq注:這看來是一個業務DDD的問題)
banq:這其實是一個分散式問題,有CAP定理在其中權衡,URL如果沒有被解析,是否需要重試?重試多少次,是否一定追求這種高一致性,還是過段時間再試。
相關文章
- Java的URL.equals()方法竟然執行DNS解析| 黑客新聞JavaDNS黑客
- Java15 執行Hello,world竟然不用javac?Java
- iOS 本地DNS解析方法iOSDNS
- 網路駭客欺騙執行木馬的方法!(轉)
- 執行java類的--方法 batJavaBAT
- Java多執行緒技術中所有方法的詳細解析Java執行緒
- 駭客新聞對DDD的各種吐槽和經驗分享
- 解決DNS解析故障的幾種方法DNS
- java執行緒執行緒休眠,sleep方法Java執行緒
- 駭客新聞上最近CQRS的討論和實踐經驗分享
- 【JVM原始碼解析】虛擬機器解釋執行Java方法(下)JVM原始碼虛擬機Java
- 【JVM原始碼解析】虛擬機器解釋執行Java方法(上)JVM原始碼虛擬機Java
- java實現多執行緒的方法Java執行緒
- Java多執行緒的實現方法Java執行緒
- Java執行緒新特徵——Java併發庫Java執行緒特徵
- 解析Java的多執行緒機制(2)(轉)Java執行緒
- 解析Java的多執行緒機制(1)(轉)Java執行緒
- Go語言的表達性、錯誤處理方法和泛型等討論摘錄 - 駭客新聞Go泛型
- Java 終止執行緒方法Java執行緒
- Java高階-解析Java中的多執行緒機制(轉)Java執行緒
- Java調優—Btrace監控Java執行緒/方法執行引數、執行時間(Windows)Java執行緒Windows
- JAVA實現對阿里雲DNS的解析管理Java阿里DNS
- 終止java執行緒的2種方法Java執行緒
- Java建立多執行緒的一種方法Java執行緒
- JAVA中執行緒建立的2種方法Java執行緒
- Java 多執行緒同步的五種方法Java執行緒
- 我們常用的地鐵卡/銀行卡,竟然執行著一個 Java 虛擬機器Java虛擬機
- 【JAVA併發第二篇】Java執行緒的建立與執行,執行緒狀態與常用方法Java執行緒
- 呼叫JavaCalls::call()方法來執行Java方法Java
- java基礎:執行緒方法之yield方法Java執行緒
- 解析最快的dns 最快最穩定的dnsDNS
- Java原始碼解析 - ThreadPoolExecutor 執行緒池Java原始碼thread執行緒
- Java原始碼解析 ThreadPoolExecutor 執行緒池Java原始碼thread執行緒
- Java執行緒池ThreadPoolExecutor原始碼解析Java執行緒thread原始碼
- 最全面的Java多執行緒用法解析Java執行緒
- Java—執行緒的生命週期及執行緒控制方法詳解Java執行緒
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- Java 執行緒池獲取池中所有執行緒列表的方法Java執行緒