2009-12-24 165 views
40

我有一個網站在路徑部分中處理「/」和「%2F」查詢字符串)的URL不同。根據RFC或現實世界,這是一件壞事嗎?我使用我正在使用的Web框架(Ruby on Rails)以及下面的層(Passenger,Apache,例如,我必須爲Apache啓用「ALLOW_ENCODED_SLASHES」)時遇到一些小驚喜, 。我現在傾向於完全擺脫編碼的斜槓,但是我不知道是否應該提交錯誤報告,我發現涉及編碼斜線的奇怪行爲。是在HTTP URL的路徑部分中等效於編碼斜槓(「%2F」)的斜槓(「/」)

至於爲什麼我在首位編碼的斜線,基本上我有途徑,如這樣的:

:controller/:foo/:bar 

其中:foo是類似的東西可以包含斜線的路徑。我認爲要做的最簡單的事情就是URL跳轉foo,這樣路由機制就忽略了斜槓。現在我懷疑了,很明顯,框架並不真的支持這個,但根據RFC,這樣做是錯誤的嗎?

下面是一些信息,我已經收集:

RFC 1738(網址):

通常一個URL時,有一個字節由字符表示的相同的解釋,當它編碼。但是,對於保留字符,這不是真的:編碼爲特定方案保留的字符可能會改變URL的語義。

RFC 2396(URI)來:

這些字符被稱爲 「保留」,因爲URI組件內它們的使用被限制在他們的保留的目的。如果URI組件的數據與保留目的衝突,那麼衝突數據必須在形成URI之前轉義。

(在這裏所做的逃逸意味着其他的東西比編碼保留字?)

RFC 2616(HTTP/1.1):

比在 「保留」 之外

字符和「不安全「(參見RFC 2396 [42])等同於它們的」「%」HEX HEX「編碼。

還有this bug report爲Rails,他們似乎期望編碼的斜線表現不同:

對,我期望不同的結果,因爲他們在不同的資源指向。

它正在尋找根目錄中的文字文件'foo/bar'。非轉義版本正在尋找目錄foo中的文件欄。

從RFC中可以清楚的看出,raw與encoded是相當於未經保留的字符,但保留字符的故事是什麼?

+0

相關:http://stackoverflow.com/q/14631200/1591669 – unor 2013-02-07 00:47:08

+0

PHP使用前端控制器的用戶:$ _GET&$ _REQUEST已經被urldecoded了。這可能會導致斜線問題,因爲您無法分辨斜線是什麼,以及%2F是什麼。如果您確實需要查看發送的請求,請查看$ _SERVER ['REQUEST_URI']。另請參見[urldecode()@ php.net](http://php.net/manual/en/function.urldecode.php) – 2014-11-12 18:33:03

回答

18

從你收集的數據中,我會傾向於說在uri中編碼的「/」意味着在application/cgi級別再次被視爲「/」。

也就是說,如果您使用的是例如mod_rewrite的apache,那麼它將不會匹配預期使用帶有編碼斜槓的URI的斜線的模式。 但是,一旦調用了適當的module/cgi/...來處理請求,就需要進行解碼,並且,例如,檢索包含斜線的參數作爲URI的第一個組件。

如果您的應用程序然後使用此數據來檢索文件(其文件名包含斜線),那可能是一件壞事。總之,我發現在「/」或「%2F」中看到行爲差異是完全正常的,因爲他們的解釋將在不同層次完成。

+0

這幾乎是我一直在想的。不幸的是,看起來在現實世界中沒有太多的支持。我現在會繼續努力,但如果我要重新開始,我會嘗試一種不同的轉義機制。 – user85509 2009-12-25 01:01:37

6

我也有一個網站,有urlencoded字符的許多網址。我發現許多Web API(包括谷歌網站管理員工具和幾個Drupal模塊)都會通過urlencoded字符進行瀏覽。許多API在其進程的某個時間點自動解碼URL,然後將結果用作URL或HTML。當我發現其中一個問題時,我通常會對該API的結果進行雙重編碼(將%2f轉換爲%252f)。但是,這會打破其他不希望進行雙重編碼的API,因此這不是一個通用的解決方案。

就我個人而言,我儘可能多地刪除了我的URL中的特殊字符。

此外,我用我的網址,ID號不依賴於urldecoding:

example.com/blog/my-amazing-blog%2fstory/yesterday

變爲:

example.com/blog/12354/my-amazing-blog%2fstory/yesterday

在這種情況下,我的代碼只使用12354來查找文章,其餘的URL被我的系統忽略(但是仍然用於搜索引擎優化。)此外,這個數字應該出現在未使用的URL co mponents。這樣,即使%2f得到錯誤解碼,網址仍然可以正常工作。

此外,一定要使用規範標籤,以確保url錯誤不會翻譯成重複的內容。

+0

這種方法似乎對reddit.com非常有效。 – StockB 2016-12-13 14:46:30

0

如果:foo以其自然形式包含斜槓該怎麼辦?你不希望它是推薦試圖保留的區別? It specifically notes

相似於UNIX和其它磁盤操作系統文件名約定應視爲純屬巧合,而不應被視爲表明URI就應該解釋爲文件名。

如果一個正在建設的在線界面的備份程序,並希望表達的路徑作爲URL路徑的一部分,這將是有意義的編碼的文件路徑斜槓,因爲這是真的是資源層次結構的一部分 - 更重要的是,路線/backups/2016-07-28content//home/dan/在雙斜槓中丟失了文件系統的根目錄。正如我讀過的那樣,跳出斜槓是區分的適當方式。

相關問題