Czy ktoś zna pełną listę znaków, których można używać w ramach GET bez kodowania? W tej chwili używam AZ az i 0-9 ... ale szukam pełnej listy.
Interesuje mnie również to, czy wydano specyfikację dla nadchodzącego dodatku chińskiego, arabskiego adresu URL (co oczywiście będzie miało duży wpływ na moje pytanie)
!*'();:@&=+$,/?#[]
lub niezarezerwowaneA-Za-z0-9_.~-
(lub znak procentowy%
jako część kodowania procentowego)REGEXP '[^]A-Za-z0-9_.~!*''();:@&=+$,/?#[%-]+'
aby znaleźć ciąg URL ze złymi znakami. Może to też jest przydatne dla kogoś innego.Odpowiedzi:
Ze specyfikacji RFC 1738 :
EDYCJA: Jak słusznie zauważa @Jukka K. Korpela, ten RFC został zaktualizowany przez RFC 3986 . To rozszerzyło i wyjaśniło znaki ważne dla hosta, niestety nie jest łatwo kopiowane i wklejane, ale dam z siebie wszystko.
W pierwszej kolejności:
źródło
A-Za-z0-9_.-~
niezarezerwowanych i zarezerwowanych znaków na początku tej odpowiedzi.!*'();:@&=+$,/?#[]
Może zaoszczędzić czas ludziomreserved = gen-delims / sub-delims gen-delims = ":" / "/" / "?" / "#" / "[" / "]" / "@"
http://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters
mówi to RFC 3986 znaków bezwarunkowe (s. 2,3), a także znaków zastrzeżonych (sec 2.2), jeśli trzeba zachować swoje szczególne znaczenie. A także znak procentowy jako część kodowania procentowego.
źródło
The characters allowed in a URI are either reserved or unreserved (or a percent character as part of a percent-encoding)
Pełna lista 66 niezarezerwowanych znaków znajduje się w RFC3986, tutaj: http://tools.ietf.org/html/rfc3986#section-2.3
Jest to dowolny znak w następującym zestawie wyrażeń regularnych:
źródło
{}^\~
ibacktick
jako niebezpieczne. A RFC3986 wymienia \ jako niebezpieczne ze względu na system plików. Można to{}^
również wykorzystać.-
lub umieścić go na początku lub na końcu klasy postaci, ponieważ[.-~]
faktycznie zawiera wszystkie znaki ASCII od 46 do 126.Przetestowałem to, prosząc moją stronę internetową (apache) o wszystkie dostępne znaki na mojej niemieckiej klawiaturze jako parametr adresu URL:
Nie zostały one zakodowane:
Nie zakodowany po
urlencode()
:Nie zakodowany po
rawurlencode()
:Uwaga: przed PHP 5.3.0
rawurlencode()
zakodowany z~
powodu RFC 1738 . Ale został zastąpiony przez RFC 3986, więc teraz jest bezpieczny w użyciu. Ale nie rozumiem, dlaczego na przykład{}
są kodowane,rawurlencode()
ponieważ nie są wymienione w RFC 3986.Dodatkowy test, który przeprowadziłem, dotyczył automatycznego linkowania w wiadomościach e-mail. Przetestowałem Mozilla Thunderbird, aol.com, outlook.com, gmail.com, gmx.de i yahoo.de i w pełni powiązane adresy URL zawierające te znaki:
Oczywiście również
?
był powiązany, ale tylko jeśli był użyty raz.Niektórzy sugerują teraz używanie tylko
rawurlencode()
znaków, ale czy słyszałeś kiedyś, że ktoś miał problemy z otwarciem tych stron?Gwiazdka
http://wayback.archive.org/web/*/http://google.com
Dwukropek
https://en.wikipedia.org/wiki/Wikipedia:About
Plus
https://plus.google.com/+google
Na znak, dwukropek, przecinek i wykrzyknik
https: //www.google.com/maps/place/USA/@36.2218457, ...
Z tego powodu te znaki powinny być użyteczne bez zakodowania. Oczywiście nie powinieneś używać
&;
powodu takich sekwencji kodujących&
. Ten sam powód obowiązuje,%
ponieważ był używany do kodowania znaków w ogóle. I=
ponieważ przypisuje wartość do nazwy parametru.Na koniec powiedziałbym, że można używać tych niezakodowanych:
Ale jeśli oczekujesz losowo generowanych adresów URL, nie powinieneś ich używać
.!
, ponieważ oznaczają one koniec zdania, a niektóre aplikacje pocztowe nie łączą automatycznie ostatniego znaku adresu URL. Przykład:źródło
+
szczególnie znaku :-Dod tutaj
źródło
Są one wymienione w RFC3986 . Zobacz Collected ABNF for URI, aby zobaczyć, co jest dozwolone gdzie i regex dla parsowania / sprawdzania poprawności.
źródło
RFC3986 definiuje dwa zestawy znaków, których można użyć w URI:
Zarezerwowane postacie :
:/?#[]@!$&'()*+,;=
Niezarezerwowane postacie :
A-Za-z0-9-_.~
źródło
Nadchodząca zmiana dotyczy chińskich, arabskich nazw domen, a nie URI. Umiędzynarodowione URI są nazywane IRI i są zdefiniowane w RFC 3987 . Jednak powiedziawszy, że zalecałbym nie robić tego sam, ale polegać na istniejącej, przetestowanej bibliotece, ponieważ istnieje wiele możliwości kodowania / dekodowania URI i tego, co jest uważane za bezpieczne według specyfikacji, w porównaniu do tego, co jest bezpieczne przy rzeczywistym użyciu (przeglądarki) .
źródło
Jeśli chcesz dać użytkownikom wyjątkowe wrażenia, możesz użyć
pushState
do wprowadzenia szerokiej gamy znaków do adresu URL przeglądarki:źródło