Ist array-syntax mit eckigen Klammern in der URL-query-strings gültig?
Ist es eigentlich sicher/gültig Verwendung mehrdimensionales array synthax in der URL-query-string?
http://example.com?abc[]=123&abc[]=456
Es scheint zu funktionieren in jedem browser und ich dachte immer, es war OK, aber accodring, um einen Kommentar in diesem Artikel ist es nicht: http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4
Ich würde gerne hören, eine zweite Meinung einzuholen.
- Was ist "multidimensional" in diesem? Oder beziehen Sie sich auf die get-vars wird dargestellt als ein array in einem server-side-scripting-Sprache ?
- yep, ich meine eine Abfrage-Zeichenfolge, wie dieses
?a[b][c][d][e]=f
-, server-side script dann behandelt es wie ein mehrdimensionales array
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Antwort ist nicht einfach.
Folgende ist ein Auszug aus Abschnitt 3.2.2 von RFC 3986 :
Diese scheint um die Frage zu beantworten, indem Sie Rundweg die besagt, dass eckige Klammern sind nicht erlaubt, nirgendwo sonst in der URI. Aber es gibt einen Unterschied zwischen einer eckigen Klammer und ein-Prozent-codiert eckige Klammer Zeichen.
Folgende ist ein Auszug aus dem Anfang von Abschnitt 3 von RFC 3986 :
Also die "Abfrage" ist Bestandteil der "URI".
Folgende ist ein Auszug aus Abschnitt 2.2 von RFC 3986 :
So eckigen Klammern erscheint eine Abfrage-string, aber nur, wenn Sie ein Prozent codiert. Es sei denn, Sie nicht, zu erklären, die weiter unten in Abschnitt 2.2 :
So, weil die eckigen Klammern dürfen nur in der "host" - Unterkomponente, die Sie "sollte" sein Prozent-verschlüsselt im anderen Komponenten und Unterkomponenten, und in diesem Fall in der "query" - Komponente, es sei denn, RFC 3986 ausdrücklich erlaubt, nicht-codierte eckige Klammern zur Darstellung von Daten in der query-Komponente, die ist nicht.
Jedoch, wenn ein "URI-Herstellung-Anwendung" fehl, zu tun, was Sie tun "sollten", indem Sie die eckigen Klammern nicht in der Abfrage, dann werden die Leser von URI sind nicht abzulehnen, URI schlechthin. Stattdessen werden die eckigen Klammern sind als die Zugehörigkeit zu den Daten der query-Komponente, da Sie nicht als Trennzeichen verwendet in dieser Komponente.
Dies ist, warum, zum Beispiel, ist es nicht ein Verstoß gegen RFC-3986, wenn PHP akzeptiert beide nicht-und Prozent-kodiert eckigen Klammern als gültige Zeichen in einem query-string, und auch weist Ihnen einen speziellen Zweck. Jedoch scheint es, dass Autoren, die versuchen, nutzen Sie diese Lücke, indem nicht die Prozent-Kodierung eckigen Klammern sind in Verletzung von RFC 3986.
Gemäß RFC 3986, die Query-Komponente der eine URL hat die folgende Grammatik:
Vom Anhang A der gleichen RFC:
Meine interpretation davon ist, dass alles, was nicht ist:
...sollte eine pct-encoded, ich.e Prozent-codiert. So
[
und]
sollte sein Prozent-verschlüsselt Folgen RFC 3986.reserved
undgen-delims
im Zitat, um es einfacher zu sehen, wie[]
sind eingestuft in die Grammatik - beachten Sie, dass nur eine Teilmenge derreserved
ist einpchar
.IPv6
wörtliche gilt nur für diehost
Teilhttp://[1080:0:0:0:8:800:200C:417A]/index.html
, daher denke ich, dass Sie nicht brauchen, um mit Escapezeichen versehen werden, wenn Sie in einem query-stringDavid N. Jafferian die Antwort ist fantastisch. Ich möchte nur hinzufügen, ein paar updates und praktische Hinweise:
Seit vielen Jahren, jeder browser hat Links in eckigen Klammern in den query-strings nicht, wenn die übermittlung der Anfrage an den server. (Quelle: https://bugzilla.mozilla.org/show_bug.cgi?id=1152455#c6). Als solche Stelle ich mir einen großen Teil der web-gekommen, um sich auf dieses Verhalten verlassen, das macht es extrem unwahrscheinlich, dass zu ändern.
Meinem Lesen der WHATWG-URL-standard, zumindest für web-Zwecke, kann gesehen werden, ersetzt RFC 3986, ist, dass es kodifiziert das Verhalten der nicht-Codierung
[
und]
in query-strings. Ich glaube der relevante Teil ist: https://url.spec.whatwg.org/#query-state, die keinen Hinweis über die Prozent-Kodierung dieser Zeichen.Hatte ich immer eine Versuchung zu gehen für diese Art von Abfrage, wenn ich hatte, um ein array übergeben, aber ich steuerte Weg von ihm. Der Grund:
Haben Sie ein paar Optionen, um ein array übergeben:
Und wenn Sie sicher sind, über die Sprache, die Sie verwenden, können Sie (sicher) gehen für die Art von query-string haben (Nur, dass Sie brauchen, um %-codieren
[]
auch).?abc%5B%5D=123&abc%5B%5D=456
. Sehr hässlich, ich sehen, warum es selten benutztMein Verständnis, dass die eckigen Klammern sind nicht die erste-Klasse-Bürger sowieso. Hier ist das Zitat:
http://tools.ietf.org/html/rfc1738
Ich würde im Idealfall gerne kommentieren Ethan ' s Antwort wirklich, aber nicht über genügend reputation, um es zu tun.
Ich bin nicht sicher, dass der entsprechende Teil der WHATWG-URL-standard wird hier referenziert. Ich denke, dass das richtige Teil sein könnte, in die definition eines gültigen URL-query-string, die Sie beschreibt, als aus URL Einheiten, die sich gebildet aus URL code Punkte und Prozent-codierten bytes. Eckigen Klammern aufgeführt sind, innerhalb der URL-code Punkte und fallen daher in den Prozent-codierten bytes-Kategorie.
So, in Antwort auf die ursprüngliche Frage, mehrdimensionale array-syntax (also mit eckigen Klammern repräsentieren die Indizierung von Arrays) innerhalb der query-Teil der URL gültig ist, sofern die eckigen Klammern mit Prozentzeichen codierte (als %5B für [ und %5D für ]).