web-dev-qa-db-de.com

Im Parameter GET zulässige Zeichen

Welche Zeichen sind in GET-Parametern erlaubt, ohne sie zu codieren oder zu umgehen? Ich meine so etwas:

http://www.example.org/page.php?name=XYZ

Was kann man da anstelle von XYZ haben? Ich denke nur die folgenden Zeichen:

  • a-z (A-Z)
  • 0-9
  • -
  • _

Ist dies die vollständige Liste oder sind zusätzliche Zeichen zulässig?

Ich hoffe ihr könnt mir helfen. Danke im Voraus!

46
caw

Es gibt reservierte Zeichen, die eine reservierte Bedeutung haben, das sind Trennzeichen - :/?#[]@ - und Subdelimiter - !$&'()*+,;=

Es gibt auch eine Reihe von Zeichen namens nicht reservierte Zeichen - alphanumerische Zeichen und -._~ - die nicht kodiert werden sollen.

Das bedeutet, dass alles, was nicht zu einem nicht reservierten Zeichensatz gehört,% -codiert sein soll, wenn sie keine besondere Bedeutung haben (z. B. wenn sie als Teil des Parameters GET übergeben wird)}.

Siehe auch RFC3986: Uniform Resource Identifier (URI): Generische Syntax

Die Frage fragt, welche Zeichen in den GET-Parametern erlaubt sind, ohne sie zu codieren oder zu maskieren.

Gemäß RFC3986 (allgemeine URL-Syntax) und RFC7230, Abschnitt 2.7.1 (HTTP/S-URL-Syntax) sind die einzigen Zeichen, die Sie zur prozentualen Codierung benötigen, diejenigen außerhalb von Abfrage gesetzt, siehe folgende Definition.

Es gibt jedoch zusätzliche Spezifikationen wie HTML5, Webformulare und veraltete indizierte Suche , W3C-Empfehlung. Diese Dokumente geben einigen Zeichen eine besondere Bedeutung, insbesondere bei Symbolen wie = & +;.

Andere Antworten deuten darauf hin, dass die meisten reservierten Zeichen einschließlich "/" "?" Codiert werden sollten. Das stimmt nicht Tatsächlich rät RFC3986, Abschnitt 3.4 von der Prozentkodierung "/" "?" Zeichen.

manchmal ist es für die Benutzerfreundlichkeit besser, Prozent -.__ zu vermeiden. Kodierung dieser Zeichen.

RFC3986 definiert die Abfragekomponente als:

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

Ein Prozent-Kodierungsmechanismus wird verwendet, um ein Datenoktett in einem .__ darzustellen. Komponente, wenn das entsprechende Zeichen dieses Oktetts außerhalb von .__ ist. zulässige Menge oder wird als Trennzeichen oder innerhalb von .__ verwendet. Komponente.

Die Schlussfolgerung ist, dass der XYZ-Teil Folgendes codieren soll:

special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters

Sofern nicht Sonderzeichen = &; sind Schlüssel = Wert Trennzeichen.

Das Kodieren anderer Zeichen ist zulässig, jedoch nicht erforderlich.

6
dmitri

Ab RFC 1738 , bei denen Zeichen in URLs zulässig sind:

Nur alphanumerische Zeichen, die Sonderzeichen "$ -_. +! * '()," Und reservierte Zeichen, die für ihre reservierten Zwecke verwendet werden, können verwendet werden innerhalb einer URL nicht codiert.

Die reservierten Zeichen sind ";", "/", "?", ":", "@", "=" Und "&". Dies bedeutet, dass Sie sie für die URL-Kodierung benötigen, wenn Sie sie verwenden möchten.

4
ctford

Ich habe einen Test mit der Chrome-Adressleiste und einem $QUERY_STRING in bash durchgeführt und Folgendes beobachtet:

[email protected]$%^&*()-_=+[{]}\|;:',./? und Grave (backtick) werden als Klartext durchgereicht.

, ", < und > werden in %20, %22, %3C und %3E konvertiert.

# wird ignoriert, da er von ye olde anchor verwendet wird.

Ich persönlich würde sagen, die Kugel beißen und mit base64 codieren :)

4
jimmetry

Alphanumerische Zeichen und alle 

~-_.!*'(),

sind innerhalb einer URL gültig.

Alle anderen Zeichen müssen codiert sein.

3
womp

Alle Regeln bezüglich der Kodierung von URIs (die URNs und URLs enthalten) sind in RFC1738 und RFC3986 angegeben, hier ein TL; DR dieser langen und langweiligen Dokumente:

Die Prozentcodierung (auch als URL-Codierung bezeichnet) ist ein Mechanismus zum Codieren von Informationen in einem URI unter bestimmten Umständen. Die in einem URI zulässigen Zeichen sind entweder reserviert oder nicht reserviert. Reservierte Zeichen sind Zeichen, die manchmal eine besondere Bedeutung haben, aber nicht die einzigen Zeichen, die kodiert werden müssen.

Es gibt 66 nicht reservierte Zeichen, die keine Kodierung benötigen: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~

Es gibt 18 reservierte Zeichen, die codiert werden müssen: !*'();:@&=+$,/?#[], und alle anderen Zeichen müssen codiert werden.

Um ein Zeichen prozentual zu codieren, verketten Sie einfach "%" und seinen ASCII - Wert in Hexadezimal. Die PHP-Funktionen "urlencode" und "rawurlencode" erledigen diese Aufgabe für Sie.

1
Nino Filiu

"." | "!" | "~" | "*" | "'" | "(" | ")" sind auch akzeptabel [RFC2396] . In Wirklichkeit kann sich alles in einem GET-Parameter befinden, wenn er richtig codiert ist.

0
geowa4