102 votes

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 mettre à la place de XYZ? Je pense seulement les caractères suivants:

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

Est-ce la liste complète ou y a-t-il d'autres caractères autorisés?

136voto

Il existe des caractères réservés, ayant des significations réservées, ce sont des délimiteurs — :/?#[]@ — et des sous-délimiteurs — *`!$&'()+,;=`**

Il existe également un ensemble de caractères appelé caractères non-réservés — alphanumériques et -._~ — qui ne doivent pas être encodés.

Cela signifie que tout ce qui n'appartient pas à l'ensemble des caractères non-réservés doit être codé en pourcentage, lorsqu'ils n'ont pas de signification spéciale (par exemple, lorsqu'ils sont transmis en tant que partie d'un paramètre GET).

Voir aussi RFC3986: Uniform Resource Identifier (URI): Generic Syntax

26voto

dmitri Points 1184

La question demande quels caractères sont autorisés 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 de l'URL HTTP/S), les seuls caractères que vous devez encoder en pourcentage sont ceux qui se trouvent en dehors de l'ensemble de la query, voir la définition ci-dessous.

Cependant, il existe d'autres spécifications comme HTML5, Web forms, et l'obsolete Indexed search, recommandation du W3C. Ces documents ajoutent un sens spécial à certains caractères notamment, à des symboles comme \= & + ;.

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

il est parfois préférable pour la convivialité d'éviter d'encoder en pourcentage ces caractères.

RFC3986 définit le composant de la requête comme suit:

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

Un mécanisme d'encodage en pourcentage est utilisé pour représenter un octet de données dans un composant lorsque le caractère correspondant à cet octet est en dehors de l'ensemble autorisé ou est utilisé comme délimiteur, ou à l'intérieur du composant.

La conclusion est que la partie XYZ devrait encoder:

special: # % = & ;
Espace
sub-delims
hors de l'ensemble de la query: [ ]
caractères encodables non ASCII

Sauf si les symboles spéciaux = & ; sont des séparateurs clé=valeur.

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

8voto

jimmetry Points 423

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

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

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

# est ignoré, car il est utilisé par le vieil ancre.

Personnellement, je dirais mordre la balle et encoder avec base64 :)

8voto

Nino Filiu Points 3662

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

Le codage en pourcentage, également connu sous le nom de codage d'URL, est un mécanisme pour encoder des informations dans une URI dans certaines circonstances. Les caractères autorisés dans une URI sont soit réservés soit non réservés. Les caractères réservés sont ceux qui ont parfois un sens spécial, mais ce ne sont pas les seuls caractères qui nécessitent un encodage.

Il y a 66 caractères non réservés qui n'ont pas besoin d'être encodés : abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.~

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

Pour encoder en pourcentage un caractère, il suffit de concaténer "%" et sa valeur ASCII en hexadécimal. Les fonctions php urlencode et rawurlencode font ce travail pour vous, tout comme les fonctions js encodeURIComponent et encodeURI.

5voto

ctford Points 3599

De RFC 1738 sur les caractères autorisés dans les URL :

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X