Caractères autorisés dans le paramètre GET

quels caractères sont autorisés dans les paramètres GET sans les encoder ou les échapper? Je veux dire quelque chose comme ceci:

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

Que pouvez-vous y avoir à la place de XYZ? Je pense que seuls les caractères suivants:

  • A-z (A-Z)
  • 0-9
  • -
  • __

Est-ce la liste complète ou y at-il des caractères supplémentaires autorisées?

je j'espère que vous pourrez m'aider. Merci à l'avance!

42
demandé sur caw 2009-09-21 20:59:07

7 réponses

Il y a les caractères réservés, qui ont un sens réservé, ce sont des délimiteurs - :/?#[]@ - et subdelimiters -!$&'()*+,;=

Il y a aussi un ensemble de caractères appelée caractères sans réserve - les caractères alphanumériques et -._~ - qui ne sont pas encodés.

c'est à dire Que tout ce qui n'appartient pas à un jeu de caractères sans réserve est supposé être encodé par%, quand ils le font n'ont pas de signification particulière (par exemple lorsqu'ils sont passés en tant que partie de GET paramètre).

Voir aussi RFC3986: Identificateur de Ressource Uniforme (URI): Syntaxe Générique

68
répondu Michael Krelin - hacker 2009-09-21 17:09:34

RFC 1738 sur lesquels les caractères sont autorisés dans les URLs:

Seuls les caractères alphanumériques, les caractères spéciaux "$-_.+!*'(),", et les caractères réservés utilisés à leurs fins réservées peuvent être utilisés non codée dans une URL.

Les caractères réservés sont ";", "/", "?", ":", "@", "=" et "&", ce qui signifie que vous auriez besoin de les encoder, si vous souhaitez les utiliser.

4
répondu ctford 2009-09-21 19:11:50

j'ai fait un test en utilisant la barre D'adresse Chrome et un $QUERY_STRING en bash, et observé ce qui suit:

~!@$%^&*()-_=+[{]}\|;:',./? et grave (backtick) sont transmises en clair.

, ",< et > sont convertis %20,%22,%3C et %3E respectivement.

# est ignoré, car il est utilisé par ye olde ancre.

Personnellement, je dirais mordre la balle et de l'encoder en base64 :)

4
répondu jimmetry 2013-12-18 08:40:37

caractères Alphanumériques et tous

~-_ .!*'(),

sont valides dans une URL.

Tous les autres caractères doivent être encodés.

3
répondu womp 2013-09-16 22:30:31

toutes les règles concernant L'encodage D'URIs (qui contient URNs et URLs) sont spécifiées dans le RFC1738 et le RFC3986, voici un TL; DR de ces documents longs et ennuyeux:

il y a 66 caractères sans réserve qui n'ont pas besoin d'encodage: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~

il y a 18 caractères réservés qui doivent être encodés:!*'();:@&=+$,/?#[], et tous les autres caractères doivent être encodés.

à pourcentage-encoder un caractère, concaténer simplement " % " et sa valeur ASCII en hexadécimal. Les fonctions php "urlencode" et "rawurlencode" faire ce travail pour vous.

1
répondu Nino Filiu 2017-09-20 12:30:26

la question demande quels caractères sont autorisé dans les paramètres GET sans les encoder ou les échapper.

Selon RFC3986 (syntaxe générale de L'URL) et RFC7230, section 2.7.1 (syntaxe D'URL HTTP/s) les seuls caractères dont vous avez besoin pour cent-encoder sont ceux situés à l'extérieur de requête définir, voir la définition ci-dessous.

cependant, il y a des spécifications supplémentaires comme HTML5, formulaires Web, et le obsolètes Indexé de recherche, recommandation du W3C. Ces documents ajoutent une signification particulière à certains caractères, notamment aux symboles comme = & +;.

D'autres réponses ici suggèrent que la plupart des caractères réservés devraient être codés, y compris"/"?". Ce n'est pas correct. En fait, RFC3986, section 3.4 déconseille l'encodage en pourcentage"/""?" caractère.

RFC3986 définit composant de requête:

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

la conclusion est que la partie XYZ doit encoder:

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

sauf si symboles spéciaux =& ;clé=valeur séparateurs.

Encoder d'autres caractères est autorisé mais pas nécessaire.

1
répondu dmitri 2018-03-21 07:23:59

"." | "!" | "~" | "*" | "'" | "(" | ")" sont également acceptables [RFC2396]. Vraiment, tout peut être dans un paramètre GET s'il est correctement encodé.

0
répondu geowa4 2009-09-21 17:07:07