2012-07-15 4 views
17

È effettivamente sicuro/valido utilizzare la matrice di sintassi multidimensionale nella stringa di query dell'URL?La sintassi dell'array utilizzando parentesi quadre nelle stringhe di query URL è valida?

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

Sembra funzionare in tutti i browser e ho sempre pensato che fosse OK da usare, ma accodring a un commento in questo articolo non è: http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4

mi piacerebbe sentire un secondo parere.

+0

Che cosa è "multidimensionale" in questo? O ti stai riferendo al fatto che le vars sono rappresentate come una matrice in un linguaggio di scripting lato server? – arkascha

+0

@arkascha sì, intendo una stringa di query come questa '? A [b] [c] [d] [e] = f', lo script lato server lo tratta come un array multidimensionale –

risposta

12

La risposta non è semplice.

Quanto segue viene estratto dalla sezione 3.2.2 della RFC 3986:

Un host identificato da un indirizzo letterale Internet Protocol versione 6
[RFC3513] o poi, si distingue per racchiudendo il IP letterale
all'interno di parentesi quadre ("[" e "] "). Questo è l'unico posto in cui i caratteri della parentesi quadra sono consentiti nella sintassi URI
.

Questo sembra di rispondere alla domanda da categoricamente affermando che le parentesi quadre non sono ammessi in nessun'altra parte del URI. Ma c'è una differenza tra un carattere di parentesi quadra e un carattere di parentesi quadra con codifica percentuale.

Il seguente è estratto da inizio sezione 3 della RFC 3986:

  1. Componenti sintassi

    La sintassi URI generico costituito da una sequenza gerarchica di
    componenti denominati schema, autorizzazione, percorso, query e frammento
    .

    URI = schema ":" hier-part ["?" interrogazione] [frammento "#"]

Così il "query" è una componente della "URI".

Il seguente è estratto dalla sezione di 2,2 RFC 3986:

2,2. Caratteri riservati

Gli URI includono componenti e sottocomponenti che sono delimitati da
caratteri nel set "riservato". Questi personaggi sono chiamati
"riservato", perché può (o non può) essere definito come delimitatori dal
la sintassi generica, da ogni sintassi specifica-schema, o dal
sintassi specifica implementazione di algoritmi dereferencing di un URI.
Se i dati per un componente URI sono in conflitto con uno scopo riservato del carattere come delimitatore, i dati in conflitto devono essere
codificati in percentuale prima della creazione dell'URI.

reserved = gen-delims/sub-delims 

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

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

parentesi Così quadrati possono essere visualizzati in una stringa di query, ma solo se sono codificati per cento. A meno che non lo sono, per essere spiegati più in basso nella sezione 2.2:

URI applicazioni che producono dovrebbero ottetti di dati per cento-codificare che
corrispondono ai caratteri nel set riservato a meno che questi personaggi
sono specificatamente ammessi dal Schema URI per rappresentare i dati nel componente .Se un carattere riservato si trova in un componente URI e ruolo
senza delimitazione è noto per quel carattere, allora deve essere
interpretato come rappresentante l'ottetto di dati corrispondente a codifica
personaggio in US-ASCII.

Quindi, perché le parentesi quadre sono ammessi solo nel sottocomponente "host", "dovrebbero" essere per cento codificati in altri componenti e sottocomponenti, e in questo caso nel componente "query", a meno che RFC 3986 consente in modo esplicito non codificato parentesi quadre per rappresentare i dati nel componente di query, che non è.

Tuttavia, se una "Applicazione di produzione di URI" non riesce a fare ciò che "dovrebbe" fare, lasciando parentesi quadre non codificate nella query, i lettori dell'URI non devono rifiutare l'URI a titolo definitivo. Invece, le parentesi quadre devono essere considerate come appartenenti ai dati del componente di query, poiché non vengono utilizzati come delimitatori in quel componente.

Questo è il motivo per cui, ad esempio, non è una violazione di RFC 3986 quando PHP accetta parentesi quadre codificate non codificate e per cento come caratteri validi in una stringa di query e persino assegna loro uno scopo speciale. Tuttavia, sembrerebbe che gli autori che cercano di trarre vantaggio da questa scappatoia non codificando per cento le parentesi quadre sono in violazione di RFC 3986.

+0

"Le parentesi quadre possono essere visualizzate nella stringa di query se sono codificate in percentuale, a meno che non siano" xD ". risposta molto bella. –

11

Secondo la RFC 3986, il Query component di un URL ha la seguente grammatica:

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

Da appendix A dello stesso RFC:

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

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

La mia interpretazione di questo è che tutto ciò che isn' t:

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

... deve essere codificato per PCT, vale a dire codificati per cento. Pertanto, [ e ] devono essere codificati in percentuale per seguire RFC 3986.

+3

Hai certamente ragione, ma aiutami seguendo con quella interpretazione. L'estratto che hai dato è incompleto, "riservato" non viene mai più menzionato qui. Quindi la definizione non ha senso in questo modo. Mentre lo leggo, le parentesi quadre sono definite come caratteri riservati con un significato speciale (non sono sicuro quale), quindi non dovrebbero essere sfuggiti se si desidera esprimere quel significato. Se esci, trasferisci semplicemente una stringa contenente parentesi quadre come valore del parametro. Quindi mi chiedo: bene, che cosa è in realtà il significato di parentesi quadre riservate ai caratteri negli url? – arkascha

+0

Ho lasciato la definizione di 'reserved' e' gen-delims' nella citazione per rendere più semplice vedere come '[]' sono classificati nella grammatica - si noti che solo un sottoinsieme di 'reserved' è un' pchar'. –

+0

Le parentesi quadre sono riservate ai valori letterali dell'indirizzo IP v6. http://tools.ietf.org/html/rfc3986#appendix-D.1, http://tools.ietf.org/html/rfc2732#section-2 –

1

Ho sempre avuto la tentazione di andare per quel tipo di query quando ho dovuto passare un array, ma mi sono allontanato da esso. Il motivo è:

  • Non viene definito in RFC.
  • Diverse lingue potrebbero interpretarlo in modo diverso.

avete un paio di opzioni per passare una matrice: (? JSON può essere)

  • Encode la rappresentazione di stringa della matrice
  • avere parametri come "val1 = blah & val2 = blah & .. "o qualcosa del genere.

E se si è sicuri circa la lingua in uso, è possibile (in modo sicuro) va per il tipo di stringa di query che hai (Solo che è necessario% -encode [] anche).

+0

Quindi questo sarà un URL multiarray valido? '? Abc% 5B% 5D = 123 & abc% 5B% 5D = 456'. Molto brutto, vedo perché è usato raramente –

+1

Ciò dipenderebbe dal modo in cui la lingua lo tratta. È meglio starne alla larga. Per essere un po 'più precisi, sono solo coppie chiave-valore. Niente di più, niente di meno e non c'è alcun "array" in esso. – SuperSaiyan

1

La mia comprensione che le parentesi quadre non sono comunque cittadini di prima classe. Ecco la citazione: http://tools.ietf.org/html/rfc1738

Altri personaggi sono sicuri perché gateway e altri agenti di trasporto sono noti a volte modificare tali caratteri. Questi caratteri sono "{", "}", "|", "\", "^", "~", "[", "]" e "` ".