Czy adres URL może zawierać spację?

136

Czy identyfikator URI (w szczególności adres URL HTTP) może zawierać jeden lub więcej znaków spacji? Jeśli adres URL musi być zakodowany, czy jest to +tylko powszechnie przestrzegana konwencja, czy uzasadniona alternatywa?

W szczególności, czy ktoś może wskazać RFC, który wskazuje, że adres URL ze spacją musi być zakodowany?

Motywacja do pytania: podczas testowania wersji beta witryny internetowej zauważyłem, że niektóre adresy URL zostały utworzone ze spacjami. Wydawało się, że Firefox postępuje właściwie, co mnie zaskoczyło! Chciałem jednak móc wskazać programistom dokument RFC, aby poczuli potrzebę naprawienia tych adresów URL.

Joe Casadonte
źródło
nadzbiór, który przyszedł później: jakie są wszystkie nieprawidłowe znaki: stackoverflow.com/questions/1547899/ ...
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Odpowiedzi:

104

Zgodnie z RFC 1738 :

Niebezpieczny:

Znaki mogą być niebezpieczne z wielu powodów. Znak spacji jest niebezpieczny, ponieważ znaczące spacje mogą zniknąć, a nieznaczne spacje mogą zostać wprowadzone, gdy adresy URL są transkrybowane, składane lub poddawane obróbce przez programy do przetwarzania tekstu. Znaki "<"i ">"są niebezpieczne, ponieważ są używane jako separatory wokół adresów URL w wolnym tekście; znak cudzysłowu ( """) jest używany do oddzielania adresów URL w niektórych systemach. Znak "#"jest niebezpieczny i zawsze powinien być kodowany, ponieważ jest używany w sieci WWW i innych systemach do oddzielania adresu URL od identyfikatora fragmentu / kotwicy, który może występować po nim. Charakter"%"jest niebezpieczna, ponieważ jest używana do kodowania innych znaków. Inne znaki są niebezpieczne, ponieważ wiadomo, że bramy i inni agenci transportu czasami modyfikują takie znaki. Te znaki są "{", "}", "|", "\", "^", "~", "[", "]", i "`".

Wszystkie niebezpieczne znaki muszą być zawsze zakodowane w adresie URL . Na przykład znak "#"musi być zakodowany w adresach URL nawet w systemach, które normalnie nie obsługują identyfikatorów fragmentów lub kotwic, więc jeśli adres URL zostanie skopiowany do innego systemu, który ich używa, nie będzie konieczna zmiana kodowania adresu URL.

Marc Novakowski
źródło
2
1738 został zastąpiony przez 2396. ietf.org/rfc/rfc2396.txt To jest aktualna specyfikacja Uri. W tym przypadku nie ma to jednak znaczenia.
Steve Severance
41
A 2396 został zastąpiony przez 3986. Wiele osób źle to rozumie, ponieważ RFC są niezmienne, a zatem nie mówią czytelnikowi, że są przestarzałe. Wskazówka: zamiast tego użyj tools.ietf.org/html/rfcnnnn , na przykład tools.ietf.org/html/rfc2396, a na górze zostaną wyświetlone brakujące metadane.
Julian Reschke
43

Dlaczego trzeba to zakodować? Żądanie wygląda następująco:

GET /url HTTP/1.1
(Ignoring headers)

Istnieją 3 pola oddzielone spacją. Jeśli umieścisz spację w swoim adresie URL:

GET /url end_url HTTP/1.1

Wiesz, że masz 4 pola, serwer HTTP powie ci, że to nieprawidłowe żądanie.

GET /url%20end_url HTTP/1.1

3 pola => ważne

Uwaga: w ciągu zapytania (po?) Spacja jest zwykle kodowana jako +

GET /url?var=foo+bar HTTP/1.1 

zamiast

GET /url?var=foo%20bar HTTP/1.1 
Julien
źródło
Co by było, gdyby var naprawdę był „foo + bar”, a nie „foo bar”?
Ivo3185
2
Twierdzę, że jest to wymóg warstwy transportowej, a nie samej specyfikacji URI. GET jest wyraźnie własnością specyfikacji http:, a nie specyfikacji adresu URL. Podobnie można argumentować, że cudzysłowy w adresach URL „muszą” być zakodowane, ponieważ w przeciwnym razie strony internetowe uległyby uszkodzeniu. Ale jest to właściwość ograniczeń formatowania HTML (wobec których istnieją inne strategie), a nie właściwość specyfikacji adresu URL.
Kent Fredric
ietf.org/rfc/rfc1738.txt - niebezpieczne znaki łącznie ze spacjami) należy zakodować
Julien
@KentFredric Jest to bardziej prawdopodobne, że jest to warstwa prezentacji , a nie warstwa transportowa . Jak (prawie) pisze Julien , oryginalna specyfikacja URI ( RFC 1630 ) zawiera to ograniczenie, więc jest częścią samej specyfikacji URI, niezależnie od twoich osobistych odczuć. Ponieważ specyfikacja URI została napisana po wersjach roboczych HTTP, jest bardzo możliwe, że identyfikatory URI zostały zaprojektowane z myślą o HTTP, w tym z zakazem używania spacji, ale to nie ma znaczenia, prawda? Prawda jest taka, że ​​specyfikacja jest tym, czym jest specyfikacja.
Christopher Schultz
38

Krótsza odpowiedź: nie, musisz zakodować spację; to jest poprawne zakodować jako miejsca +, ale tylko w ciągu zapytania; na ścieżce, której musisz użyć %20.

Peter Hilton
źródło
1
Cześć, ja też jestem zdezorientowany, czasami widziałem, że książka używa „+”, ale czasami „% 20”, czy możesz pokazać jakiś przykład na to? Kiedy użytkownik przesyła formularz, w jaki sposób formularz koduje spację? z jaką postacią?
Sam YC
1
Zobacz tę odpowiedź, aby uzyskać dodatkowe szczegóły.
DavidRR
a co z częścią z fragmentem / krzyżykiem? Jak należy tam zakodować spacje?
Gumkins
@gumkins: fragment (# i po) nie jest wysyłany na serwer. W praktyce możesz użyć% 20 lub + w dowolnym miejscu do zakodowania spacji.
Julien
9

Adresy URL są zdefiniowane w RFC 3986 , chociaż inne specyfikacje RFC są również istotne, ale RFC 1738 jest przestarzały.

Mogą nie mieć w sobie spacji, podobnie jak wiele innych znaków. Ponieważ te zabronione znaki często muszą być w jakiś sposób reprezentowane, istnieje schemat kodowania ich w adresie URL poprzez przetłumaczenie ich na ich szesnastkowy odpowiednik ASCII z prefiksem „%”.

Większość języków / platform programowania udostępnia funkcje do kodowania i dekodowania adresów URL, chociaż mogą one nie być zgodne ze standardami RFC. Na przykład wiem, że PHP nie.

Rob Williams
źródło
7

Tak, jednak spacja jest zwykle zakodowana jako „% 20”. Wszelkie parametry przekazywane do adresu URL powinny być zakodowane, po prostu ze względów bezpieczeństwa.

user54650
źródło
6

Adres URL może zawierać spację i w większości przeglądarek będzie wyświetlany jako% 20, ale reguły kodowania przeglądarki zmieniają się dość często i nie możemy polegać na tym, jak przeglądarka wyświetli adres URL.

Zamiast tego możesz zastąpić znak spacji w adresie URL dowolnym znakiem, który Twoim zdaniem powinien uczynić adres URL bardziej czytelnym i „ładnym”;) ..... O, więc preferowane znaki ogólne to „-”, „_”, „+”… ale to nie są kompulsje, więc możesz użyć dowolnego znaku, którego nie ma już w adresie URL.

Unikaj%, &,}, {,], [, /,>, <jako zastępowania znaków spacji adresu URL, ponieważ mogą one spowodować błąd w niektórych przeglądarkach i platformach.

Jak widać, samo przepełnienie Staku używa znaku „-” jako zamiennika spacji (% 20).

Miłego przesłuchania.

AM Web Surfer
źródło
5

Adresy URL nie powinny zawierać spacji. Jeśli chcesz zaadresować taki, który to robi, użyj jego zakodowanej wartości%20

Chris Ballance
źródło
5

Czy ktoś może wskazać dokument RFC wskazujący, że adres URL ze spacją musi być zakodowany?

Identyfikatory URI, a tym samym adresy URL, są zdefiniowane w dokumencie RFC 3986.

Jeśli spojrzysz na zdefiniowaną tam gramatykę, w końcu zauważysz, że znak spacji nigdy nie może być częścią składniowo poprawnego adresu URL, więc termin „URL ze spacją” jest sam w sobie sprzecznością.

Julian Reschke
źródło
3

Odpowiedzieć na Twoje pytanie. Powiedziałbym, że dość często aplikacje zastępują spacje w wartościach, które będą używane w adresach URL. Powodem tego jest zwykle unikanie trudniejszego do odczytania kodowania procentowego (URI), które występuje.

Przeczytaj ten artykuł w Wikipedii o kodowaniu procentowym .

Eric Schoonover
źródło
1

Firefox 3 wyświetli %20s w adresach URL jako spacje w pasku adresu.

Sophie Alpert
źródło
To nie jest właściwa odpowiedź na pytanie ładna prosta: "Is a URL allowed to contain a space?". Raczej komentarz.
Roko C. Buljan