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
- 解決DNS解析故障的幾種方法DNS
- java執行緒執行緒休眠,sleep方法Java執行緒
- 【JVM原始碼解析】虛擬機器解釋執行Java方法(下)JVM原始碼虛擬機Java
- 【JVM原始碼解析】虛擬機器解釋執行Java方法(上)JVM原始碼虛擬機Java
- Apache Mesos為什麼會失敗?(黑客新聞)Apache黑客
- JAVA實現對阿里雲DNS的解析管理Java阿里DNS
- 呼叫JavaCalls::call()方法來執行Java方法Java
- Java原始碼解析 ThreadPoolExecutor 執行緒池Java原始碼thread執行緒
- Java原始碼解析 - ThreadPoolExecutor 執行緒池Java原始碼thread執行緒
- Java執行緒池ThreadPoolExecutor原始碼解析Java執行緒thread原始碼
- 舊瓶裝新酒,中國黑客執行遠端攻擊黑客
- 終止java執行緒的2種方法Java執行緒
- Java建立多執行緒的一種方法Java執行緒
- 【JAVA併發第二篇】Java執行緒的建立與執行,執行緒狀態與常用方法Java執行緒
- 新的PHP高危漏洞可導致黑客執行遠端程式碼攻擊PHP黑客
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- Java—執行緒的生命週期及執行緒控制方法詳解Java執行緒
- Java 執行緒池獲取池中所有執行緒列表的方法Java執行緒
- Java 執行緒建立與常用方法Java執行緒
- 死磕 java執行緒系列之執行緒池深入解析——普通任務執行流程Java執行緒
- 我們常用的地鐵卡/銀行卡,竟然執行著一個 Java 虛擬機器Java虛擬機
- 解析最快的dns 最快最穩定的dnsDNS
- 執行緒的基本解析執行緒
- 死磕 java執行緒系列之執行緒池深入解析——未來任務執行流程Java執行緒
- 什麼是DNS解析?DNS解析的過程是什麼樣的?DNS
- 什麼是DNS解析?如何提升DNS解析安全?DNS
- 死磕 java執行緒系列之ForkJoinPool深入解析Java執行緒
- Java如何測量方法執行時間Java
- 深入理解Java中的反射機制和使用原理!詳細解析invoke方法的執行和使用Java反射
- 國內目前最快的dns 2022解析最快的dnsDNS
- 用Rust替代Java重寫DNS解析器RustJavaDNS
- DNS解析流程DNS
- DNS解析原理DNS
- Java非同步判斷執行緒池所有任務是否執行完成的方法Java非同步執行緒
- 技術分享 | DNS解析不生效的原因及解決方法DNS
- 深入原始碼,深度解析Java 執行緒池的實現原理原始碼Java執行緒