HTTPURLConnection 的安全重定向問題
在Java 中,HttpURLConnection 在執行從HTTP 轉換為HTTPS URL 的HTTP 重定向時會遇到從HTTP到困難。在某些情況下觀察到的這種行為使尋求理解根本原因的開發人員感到困惑。
為了說明該問題,請考慮以下程式碼片段:
import java.net.URL; import java.net.HttpURLConnection; import java.io.InputStream; public class Tester { public static void main(String argv[]) throws Exception{ InputStream is = null; try { String httpUrl = "http://httpstat.us/301"; URL resourceUrl = new URL(httpUrl); HttpURLConnection conn = (HttpURLConnection)resourceUrl.openConnection(); conn.setConnectTimeout(15000); conn.setReadTimeout(15000); conn.connect(); is = conn.getInputStream(); System.out.println("Original URL: "+httpUrl); System.out.println("Connected to: "+conn.getURL()); System.out.println("HTTP response code received: "+conn.getResponseCode()); System.out.println("HTTP response message received: "+conn.getResponseMessage()); } finally { if (is != null) is.close(); } } }
當使用初始 URL 設定為“http://httpstat.us/301”,輸出顯示 Java 的 HttpURLConnection不遵循重定向到「https://httpstat.us。」
理解行為
此行為的解釋在於 Java 處理重定向的方式。預設情況下,僅當它們使用相同協定時才會遵循重定向。此限制是在 followRedirect() 方法中實現的。
需要注意的是,HTTPS 雖然模仿 HTTP,但從協定角度來看,被視為與 HTTP 不同的協定。因此,Java 需要使用者批准才能遵循從 HTTP 到 HTTPS 的重定向。為了防止潛在的安全問題,此預防措施是必要的。
例如,如果用戶端在使用 HTTP 進行匿名瀏覽時配置為自動客戶端身份驗證,則在未經用戶明確同意的情況下執行 HTTPS 重定向將會洩露客戶端的身份伺服器。
以上是為什麼 Java 的 HttpURLConnection 預設不遵循 HTTP 到 HTTPS 重定向?的詳細內容。更多資訊請關注PHP中文網其他相關文章!