知識庫 / Spring / Spring Web RSS 訂閱

使用斜槓字符在 Spring URL 中

Spring Web
HongKong
4
01:11 PM · Dec 06 ,2025

1. 簡介

在開發 Web 服務時,我們可能需要處理包含斜線的複雜或意外 URL 路徑。 這種情況下,我們可能會遇到在使用 Web 服務器或框架時出現問題。

Spring 尤其在這個方面可能有些棘手,因為它的默認配置對此有所影響。

在本教程中,我們將展示處理帶有斜線的 URL 的常見解決方案和建議,以及在 Spring 中如何避免使用一些常見的“黑客”方法。 繼續閲讀以瞭解更多信息!

2. 手動解析請求

在我們的 Web 服務中,有時我們需要將特定路徑下的所有請求映射到同一個端點。更糟糕的是,我們可能無法知道路徑的其餘部分是什麼樣子的。我們可能還需要以某種方式將此路徑作為參數接收,以便稍後使用。

假設我們可以接收在 /mypaths</em/> 下的任何路徑的請求。

http://localhost:8080/mypaths/any/custom/path

假設我們想要將所有這些不同的路徑存儲在數據庫中,以便了解我們正在接收哪些請求。

最有可能出現在我們腦海中的第一個解決方案是將路徑中的動態部分捕獲到一個PathVariable

@GetMapping("mypaths/{anything}")
public String pathVariable(@PathVariable("anything") String anything) {
    return anything;
}

不幸的是,我們很快發現 這在 PathVariable 包含斜槓時會返回 404。斜槓字符是 URI 標準 的路徑分隔符,並且在其後的所有內容都將被視為路徑層次結構中的新級別。正如預期的那樣,Spring 遵循了這一標準。

我們可以通過使用通配符輕鬆解決這個問題,為特定路徑下的所有請求創建一個備用方案:

@GetMapping("all/**")
public String allDirectories(HttpServletRequest request) {
    return request.getRequestURI()
        .split(request.getContextPath() + "/all/")[1];
}

然後,我們需要自行解析URI以獲取我們感興趣的路徑部分。

此解決方案在處理類似URL的參數時非常方便,但正如我們將在下一部分看到的,它對於某些其他情況來説是不夠的。

3. 使用查詢參數

與我們之前的示例不同,在某些情況下,我們不僅要映射不同的路徑,還要接收 URL 中的任何 String 作為參數。

假設在之前的示例中,我們使用一個包含連續斜線的路徑參數進行 請求

http://localhost:8080/all/http://myurl.com

起初,我們認為這樣應該可以工作,但很快我們意識到我們的控制器返回的是 http:/myurl.com。 這是因為 Spring Security 對 URL 進行規範化,並用單斜槓替換所有雙斜槓

Spring 同樣對 URL 中的其他序列進行規範化,例如路徑遍歷。 它採取這些預防措施 以防止惡意 URL 繞過定義的安全約束,正如在 官方 Spring Security 文檔 中所解釋的。

在這些情況下,強烈建議使用查詢參數代替:

@GetMapping("all")
public String queryParameter(@RequestParam("param") String param) {
    return param;
}

這樣一來,我們就可以接收任何 參數,而無需受到這些安全限制,並且我們的 Web 服務將更加健壯和安全。

4. 避免使用臨時方案

我們提出的解決方案可能會暗示我們的映射設計需要做出一些改變。這可能會促使我們使用一些常見的臨時方案,以便在 URL 中包含斜槓時使我們的原始端點正常工作。

最常見的臨時方案可能是對路徑參數中的斜槓進行編碼。然而,安全漏洞被報告在過去,大多數 Web 和應用程序服務器通過默認禁止編碼後的斜槓來應對它。 仍然可以通過更改相應的設置(例如,在 Tomcat 中)來改變這種行為。

其他方案,如 Apache Server,則採取了更進一步的措施,引入了允許編碼後的斜槓而不進行解碼的選項,以便它們不被解釋為路徑分隔符。 無論如何,這不推薦,並且可能引入潛在的安全風險。

另一方面,Web 框架也採取了一些預防措施。 如我們之前所見,Spring 添加了一些機制作為保護措施,以對抗更寬鬆的 Servlet 容器。 因此,如果我們在服務器上允許編碼後的斜槓,我們仍然需要在 Spring 中允許它們。

最後,還有其他類型的臨時方案,例如更改 Spring 默認提供的 URI 規範化機制。 就像之前一樣,如果更改這些默認值,我們應該非常謹慎。

5. 結論

在本文中,我們展示了一些處理 URL 中斜槓的解決方案,這些解決方案適用於 Spring。我們還介紹瞭如果修改 Spring 這樣的服務器或框架的默認配置,可能會引發的安全問題。

一般來説,查詢參數是處理 URL 中斜槓的最佳解決方案。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.