2012-07-15 12 views
17

Czy jest rzeczywiście bezpieczne/poprawne stosowanie wielowymiarowej synthax w łańcuchu zapytania adresu URL?Czy składnia tablic przy użyciu nawiasów kwadratowych w ciągach zapytań URL jest poprawna?

http://example.com?abc[]=123&abc[]=456 

wydaje się działać w każdej przeglądarce, a ja zawsze myślałem, że to OK, aby używać, ale accodring na komentarz w tym artykule nie jest: http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4

Chciałbym usłyszeć drugą opinię.

+0

Co to jest "wielowymiarowy" w tym? Czy też odnosisz się do vars-get, które są reprezentowane jako tablica w języku skryptowym po stronie serwera? – arkascha

+0

@arkascha yep, mam na myśli ciąg zapytania podobny do tego '? A [b] [c] [d] [e] = f', skrypt po stronie serwera traktuje go jak tablicę wielowymiarową –

Odpowiedz

12

Odpowiedź nie jest prosta.

Poniższy tekst pochodzi z sekcji 3.2.2 RFC 3986:

Host identyfikowane przez adres dosłownym Protokół internetowy w wersji 6
[RFC3513] lub później wyróżnia zamykający IP dosłownym
w nawiasach kwadratowych („[” i „] "). Jest to jedyne miejsce, w którym znaki o nawiasach kwadratowych są dozwolone w składni URI.

Ten wydaje odpowiedzieć na pytanie o kategorycznie stwierdzając, że nawiasy kwadratowe nie są dozwolone nigdzie indziej w URI. Istnieje jednak różnica między znakiem nawias kwadratowy a znakiem procentu zakodowanej nawiasy kwadratowe.

ekstrahuje od początku odcinka 3 RFC 3986 następujące:

  1. Elementy składniowe

    Ogólny składni URI zawiera hierarchiczną kolejność
    komponenty określane jako schemat, autorytatywny, ścieżka, zapytanie i fragment
    .

    URI = schemat ":" hier-part ["?" Zapytanie] [ "#" fragment]

więc "zapytanie" jest elementem "URI".

Poniżej ekstrahowano z sekcji 2.2 RFC 3986:

2,2. Zarezerwowane znaki

Identyfikatory URI zawierają komponenty i podkomponenty rozdzielone znakami
w zestawie "zarezerwowanym". Znaki te są nazywane
„zastrzeżone”, ponieważ może (lub nie mogą) być zdefiniowane jako ograniczniki przez
składnia rodzajowe, przez każdego składni programu specyficznego lub przez składni
realizacji konkretnych algorytmu dereferencing URI jest.
Jeśli dane dotyczące komponentu URI będą w konflikcie z zarezerwowanym celem znaku jako ogranicznika, wówczas dane będące w konflikcie muszą być
zakodowane procentowo przed utworzeniem URI.

reserved = gen-delims/sub-delims 

    gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

    sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

nawiasy kwadratowe więc mogą pojawić się w ciągu kwerendy, ale tylko wtedy, gdy są one kodowane procent. Chyba że są one nie być wyjaśnione w dalszej części 2.2:

URI produkujące aplikacje powinny oktetów danych procent zakodować że
odpowiadają znaków w zarezerwowanym zestawu chyba że te znaki
są wyraźnie dozwolone przez Schemat URI do reprezentowania danych w tym komponencie
.Jeśli zarezerwowany znak znajduje się w składniku URI i nie jest znana rola ograniczająca dla tego znaku, to musi być interpretowana jako reprezentująca oktet danych odpowiadający temu kodowaniu znaków w US-ASCII.

Więc ponieważ nawiasy kwadratowe są dozwolone tylko w „host” podskładnika, że ​​„powinien” być procent zakodowane w innych elementów i składowych, w tym przypadku w „zapytań” komponentu, chyba RFC 3986 wyraźnie pozwala niekodowany nawiasy kwadratowe do reprezentowania danych w składniku zapytania, co nie ma miejsca.

Jeśli jednak "aplikacja do tworzenia URI" nie zrobi tego, co powinna "zrobić", przez pozostawienie kwadratowych nawiasów niezakodowanych w zapytaniu, to czytelnicy URI nie odrzucają URI wprost. Zamiast tego nawiasy kwadratowe należy uznać za przynależne do danych komponentu zapytania, ponieważ nie są one używane jako separatory w tym komponencie.

To dlatego, na przykład, nie jest to naruszenie RFC 3986, gdy PHP przyjmuje zarówno zakodowane w sposób niekodowany i procentowe nawiasy kwadratowe jako prawidłowe znaki w ciągu zapytania, a nawet przypisuje im specjalny cel. Wygląda jednak na to, że autorzy, którzy próbują wykorzystać tę lukę przez procent kodowania nawiasów kwadratowych, naruszają RFC 3986.

+0

"Nawiasy kwadratowe mogą pojawiać się w ciągu zapytania, jeśli są kodowane procentowo, chyba że nie są" xD ". bardzo ładna odpowiedź. –

11

Zgodnie z RFC 3986 The Query component z adresu URL ma następującą gramatykę:

*(pchar/"/"/"?") 

Od appendix A tego samego RFC:

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
[...] 
pct-encoded = "%" HEXDIG HEXDIG 

unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
[...]  
sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

Moja interpretacja jest to, że wszystko, nieprawdaż” t:

ALPHA/DIGIT/"-"/"."/"_"/"~"/
    "!"/"$"/"&"/"'"/"("/")"/
    "*"/"+"/","/";"/"="/":"/"@" 

... powinno być zakodowane w formacie PN, to jest kodowanie procentowe. Tak więc [ i ] powinny być zakodowane procentowo zgodnie z RFC 3986.

+3

Masz oczywiście rację, ale pomóż mi po tej interpretacji. Wyciąg, który podałeś jest niekompletny, "zarezerwowany" nigdy nie jest tu ponownie przywoływany. Tak więc definicja nie ma takiego sensu. Kiedy go czytam, nawiasy kwadratowe są zdefiniowane jako znaki zarezerwowane ze specjalnym znaczeniem (nie wiem, które), dlatego nie należy ich unikać, jeśli chcesz wyrazić to znaczenie. Jeśli uciekniesz z em, po prostu prześlij łańcuch zawierający nawiasy kwadratowe jako wartość parametru. Więc zadaję sobie pytanie: cóż, co właściwie oznacza znaczenie nawiasów kwadratowych zarezerwowanych w adresach URL? – arkascha

+0

Zostawiłem definicję 'zastrzeżone' i' gen-delims' w cytacie, aby ułatwić zobaczenie, jak '[]' są sklasyfikowane w gramatyce - zauważ, że tylko podzbiór 'reserved' jest' pchar'. –

+0

Nawiasy kwadratowe są zarezerwowane dla literałów adresów IP w wersji 6. http://tools.ietf.org/html/rfc3986#appendix-D.1, http://tools.ietf.org/html/rfc2732#section-2 –

1

Zawsze miałem pokusę, aby przejść do tego rodzaju zapytania, kiedy musiałem przekazać tablicę, ale od niej odjechałem. Przyczyną jest:

  • Nie jest wyczyszczone zdefiniowane w specyfikacji RFC.
  • Różne języki mogą interpretować to inaczej.

Masz kilka opcji, aby przekazać tablicę: (? JSON może być)

  • zakodowania znaków reprezentujący tablicę
  • mają parametry takie jak „val1 = bla & wart2 = bla & .. "lub coś w tym stylu.

Jeśli jesteś pewien języka, którego używasz, możesz (bezpiecznie) przejść do rodzaju ciągu zapytania, który masz (tylko, że musisz% -encode []).

+0

to będzie prawidłowy adres URL do wielu multimediów? '? abc% 5B% 5D = 123 & abc% 5B% 5D = 456'. Bardzo brzydki, rozumiem, dlaczego jest on rzadko używany. –

+1

To zależy od tego, jak je traktuje. Najlepiej trzymać się z daleka od tego. Aby być nieco bardziej precyzyjnym, są to po prostu pary klucz-wartość. Nic więcej, nic mniej i nie ma w nim "tablicy". – SuperSaiyan

1

Moje zrozumienie, że nawiasy kwadratowe i tak nie są pierwszorzędnymi obywatelami. Oto cytat: http://tools.ietf.org/html/rfc1738

Inne znaki są niebezpieczne, ponieważ bramy i inne środki transportu znane są czasem modyfikują takich znaków. Te znaki to "{", "}", "|", "\", "^", "~", "[", "]" i "` ".

Powiązane problemy