Czy dwukropek `:` jest bezpieczny przy użyciu przyjaznych adresów URL?

109

Projektujemy system adresów URL, który będzie określał sekcje aplikacji jako słowa oddzielone ukośnikami. W szczególności jest to w GWT, więc odpowiednie części adresu URL będą w skrócie (który zostanie zinterpretowany przez warstwę kontrolera po stronie klienta):

http://site/gwturl#section1/section2

Niektóre sekcje mogą wymagać dodatkowych atrybutów, które chcielibyśmy określić za pomocą a :, aby części sekcji adresu URL były jednoznaczne. Kod podzieliłby się najpierw /, potem dalej :, w ten sposób:

http://site/gwturl#user:45/comments

Oczywiście robimy to ze względu na przyjazność dla adresów URL, dlatego chcielibyśmy mieć pewność, że żaden z tych znaków, które będą miały specjalne znaczenie, nie zostanie zakodowany w postaci adresu URL przez przeglądarki ani żaden inny system i nie będzie miał adresu URL takiego jak to:

http://site/gwturl#user%3A45/comments <--- BAD

Czy używanie dwukropka w ten sposób jest bezpieczne (co oznacza, że ​​nie zostanie automatycznie zakodowane) dla przeglądarek, systemów zakładek, a nawet kodu Javascript lub Java?

Nicole
źródło
Może warto określić (jaśniej), że używasz adresów URL tylko po stronie klienta? Ponieważ wiele odpowiedzi (podobnie jak moja) wydaje się zakładać, że zamierzasz wysłać adres URL do serwera za pomocą protokołu HTTP.
Veger
Zmieniono, aby dodać wyjaśnienie, że użycie fragmentu ma miejsce po stronie klienta.
Nicole,
Jestem ciekawy: czy po 10 miesiącach ten schemat adresów URL zadziałał dla Ciebie? Rozważam zastosowanie tego samego schematu.
Jonathan Swinney
1
@Jonathan Swinney, Niestety odszedłem od tego projektu (i firmy), chociaż odpowiedzi tutaj usatysfakcjonowały mnie, że jest to droga do zrobienia. Gdybym miał rozpocząć nowy projekt, użyłbym tego schematu, ale na pewno użyłbym tego schematu, #!aby wskazać, że strony są stanowe - patrz googlewebmastercentral.blogspot.com/2009/10/ (ta propozycja została zastosowana do przez ciężkich użytkowników AJAX, takich jak Facebook)
Nicole
Właśnie się dowiedziałem, że WhatsApp wycina adres URL w pierwszym dwukropku, więc na przykład sprawił, że adres URL map Google stał się bezużyteczny. Więc tak, ważne jest, aby od tego uciec.
Petruza,

Odpowiedzi:

84

Niedawno napisałem koder URL, więc mam to całkiem świeże w głowie.

http://site/gwturl#user:45/comments

Wszystkie znaki we fragmencie part ( user:45/comments) są całkowicie legalne dla identyfikatorów URI RFC 3986 .

Odpowiednie części ABNF :

fragment      = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                 / "*" / "+" / "," / ";" / "="

Oprócz tych ograniczeń część fragmentowa nie ma zdefiniowanej struktury poza tą, którą daje jej aplikacja. Schemat http mówi tylko, że nie wysyłasz tej części na serwer.


EDYTOWAĆ:

D'oh!

Pomimo moich twierdzeń na temat specyfikacji URI, irreputable dostarcza poprawnej odpowiedzi, gdy zwraca uwagę, że specyfikacja HTML 4 ogranicza nazwy / identyfikatory elementów .

Zwróć uwagę, że zasady dotyczące identyfikatorów zmieniają się w HTML 5 . Ograniczenia dotyczące identyfikatorów URI będą nadal obowiązywać (w chwili pisania tego artykułu istnieją nierozwiązane problemy dotyczące korzystania z URI w HTML 5).

McDowell
źródło
Wydaje mi się, że coś ci idzie, czy możesz to wyjaśnić trochę dokładniej? Nie wysyłanie tego na serwer nie stanowi problemu, ponieważ używamy GWT. Nie jestem tylko pewien, czy rozumiem składnię określoną w cytowanej przez Ciebie sekcji.
Nicole,
Ale :jest to rozgraniczenie genów, a nie podziały podrzędne.
bobince
1
Średnik jest prawidłowy dla pchar, więc to, czy jest w sub-delim, czy gen-delim, nie stanowi problemu
Veger
@bobince - :jest w pchar, który jest w fragment, więc :jest dozwolony. @Renesis - Wikipedia ma artykuł o ABNF en.wikipedia.org/wiki/ABNF Zasadniczo patrzysz na listę dozwolonych znaków, gdzie /oznacza OR . Nie robiłem żadnego programowania GWT, więc nie wiem, jak wykorzystuje fragmentową część identyfikatorów URI.
McDowell
Ostatnie pytanie - czy masz jakiś wgląd w rzeczywiste zastosowanie tej specyfikacji? Czy to oznacza, że ​​przeglądarki powinny / będą ignorować (pomijać kodowanie) :fragmentu?
Nicole,
59

Oprócz analizy McDowella dotyczącej standardu URI pamiętaj również, że fragment musi być prawidłową nazwą kotwicy HTML. Według http://www.w3.org/TR/html4/types.html#type-name

Tokeny ID i NAZWA muszą zaczynać się od litery ([A-Za-z]) i mogą po nich następować dowolne litery, cyfry ([0-9]), łączniki („-”), podkreślenia („_”) , dwukropki („:”) i kropki („.”).

Więc masz szczęście. „:” jest wyraźnie dozwolone. I nikt nie powinien "%" - uciec od tego, nie tylko dlatego, że "%" jest tam niedozwolonym znakiem, ale także dlatego, że fragment musi pasować do nazwy kotwicy znak po znaku, dlatego żaden agent nie powinien próbować ich w żaden sposób manipulować.

Jednak musisz to przetestować. Standardy sieciowe nie są ściśle przestrzegane, czasami standardy są sprzeczne. Na przykład protokół HTTP / 1.1 RFC 2616 nie zezwala na ciąg zapytania w adresie URL żądania, podczas gdy HTML konstruuje go podczas przesyłania formularza metodą GET. Cokolwiek zaimplementowano w prawdziwym świecie, wygrywa pod koniec dnia.

niepodważalny
źródło
58

MediaWiki i inne silniki wiki używają dwukropków w swoich adresach URL do oznaczania przestrzeni nazw, bez większych problemów.

np. http://en.wikipedia.org/wiki/Template:Welcome

Paul Wray
źródło
31
Najbardziej trafna odpowiedź. Wszyscy wiemy, że specyfikacja ma niewiele wspólnego z rzeczywistością w tworzeniu stron internetowych. Nie dostaniesz znacznie lepszej gwarancji „bezpieczeństwa” niż „jedna z 10 najlepszych witryn na świecie to robi”.
Steven Collins
1
@StevenCollins Nie ma większego znaczenia niż odpowiedź udzielona 3 lata wcześniej, która mówi dokładnie to samo :)
Martin James
7

Nie liczyłbym na to. Prawdopodobnie zostanie zakodowany adres URL, tak jak %3Aprzez wielu klientów użytkownika.

Asaf
źródło
1
@arbales: Tak. Niektóre mniej zgodne programy klienckie pozostawiają niezgodne adresy URL bez ozdób.
Asaph
4

Z URLEncoderjavadoc:

Więcej informacji na temat kodowania formularzy HTML można znaleźć w specyfikacji HTML .

Podczas kodowania ciągu obowiązują następujące zasady:

  • Znaki alfanumeryczne od „a” do „z”, od „A” do „Z” i od „0” do „9” pozostają takie same.
  • Znaki specjalne „.”, „-”, „*” i „_” pozostają takie same.
  • Znak spacji „” jest konwertowany na znak plusa „+”.
  • Wszystkie inne znaki są niebezpieczne i są najpierw konwertowane na jeden lub więcej bajtów przy użyciu jakiegoś schematu kodowania. Następnie każdy bajt jest reprezentowany przez 3-znakowy ciąg „% xy”, gdzie xy jest dwucyfrową szesnastkową reprezentacją bajtu. Zalecany schemat kodowania to UTF-8. Jednak ze względu na zgodność, jeśli kodowanie nie zostanie określone, zostanie użyte domyślne kodowanie platformy.

Oznacza to, że :nie jest bezpieczny.

axtavt
źródło
3

Nie widzę kodującego Firefox lub IE8 niektórych adresów URL Wikipedii, które zawierają ten znak.

kprobst
źródło
1
Opera również zachowuje średnik, ale liczenie na takie zachowanie nie jest dobrym pomysłem
Veger
1
Renesis mówi o fragmencie adresu URL, a nie o ścieżce adresu URL.
Gumbo
Wikipedia była jedną z moich myśli, pisząc to pytanie. Czy zatem użycie dwukropków jest technicznie nieprawidłowe / niebezpieczne? Często widzę (i) w Wikipedii zakodowane adresy URL, ale nigdy dwukropek, co mnie trochę zdezorientowało.
Nicole,
3
Wayback Machine ma: w wielu linkach - np. Web.archive.org/web/20080822150704/http://stackoverflow.com
barrowc
2

Dwukropki służą do podziału między nazwą użytkownika i hasłem, jeśli protokół wymaga uwierzytelnienia.

JP Silvashy
źródło
0

Okrężnica nie jest bezpieczna. Spójrz tutaj

Pion
źródło
Ta strona nie motywuje, dlaczego nie są one bezpieczne. RFC2396, do którego odwołuje się odwołanie, również nie mówi, że powinno się go używać. Ponadto dostarczony skrypt konwertera nie koduje go (i tak w Chrome 9).
Adam Lindberg
Adam, mylisz się. Bezpośrednio określa, co i dlaczego.
ktamlyn
-5

Nie jest to bezpieczny znak i służy do rozróżnienia portu, z którym się łączysz, gdy znajduje się on bezpośrednio po nazwie domeny

RHicke
źródło