web-dev-qa-db-fra.com

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

Quels caractères sont autorisés dans les paramètres GET sans les coder ni les échapper? Je veux dire quelque chose comme ça:

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

Que pouvez-vous avoir là-bas au lieu de XYZ? Je pense que les personnages suivants:

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

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

J'espère que vous pouvez m'aider. Merci d'avance!

46
caw

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

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

Cela signifie que tout élément n'appartenant pas à un jeu de caractères non réservé est supposé être codé en%, lorsqu'il n'a pas de signification particulière (par exemple, lorsqu'il est transmis dans le paramètre GET).

Voir aussi RFC3986: Identificateur de ressource uniforme (URI): Syntaxe générique

72

La question demande quels caractères sont autorisés dans les paramètres GET sans les coder ni les échapper.

Selon RFC3986 (syntaxe d'URL générale) et RFC7230, section 2.7.1 (syntaxe d'URL HTTP/S), les seuls caractères à coder par pourcentage sont ceux qui se trouvent en dehors de l'extérieur de query set, voir la définition ci-dessous.

Cependant, il existe des spécifications supplémentaires telles que HTML5, formulaires Web et la recherche indexée obsolète , recommandation W3C. Ces documents ajoutent une signification particulière à certains caractères, notamment des symboles tels que = & +;.

D'autres réponses 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 le codage en pourcentage "/" "?" personnages.

il est parfois préférable, pour des raisons de convivialité, d’éviter les pourcentages - encoder ces caractères.

La RFC3986 définit le composant de requête en tant que:

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

Un mécanisme de codage en pourcentage est utilisé pour représenter un octet de données dans un fichier composant lorsque le caractère correspondant de cet octet est en dehors du est autorisé ou est utilisé comme délimiteur de, ou dans, le composant.

La conclusion est que la partie XYZ devrait encoder:

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

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

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

6
dmitri

From RFC 1738 sur lequel les caractères sont 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 à des fins réservées peuvent être utilisés non codé dans une URL.

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

4
ctford

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

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

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

# est ignoré, car il est utilisé par ye old anchor .

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

4
jimmetry

Caractères alphanumériques et tous 

~-_.!*'(),

sont valables dans une URL.

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

3
womp

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

Le codage en pourcentage, également appelé codage d'URL, est un mécanisme permettant de coder des informations dans un URI dans certaines circonstances. Les caractères autorisés dans un URI sont soit réservés, soit non réservés. Les caractères réservés sont les caractères qui ont parfois une signification spéciale, mais ils ne sont pas les seuls à nécessiter un encodage.

Il y a 66 caractères non réservés qui ne nécessitent aucun 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.

Pour encoder un caractère en pourcentage, concaténez simplement "%" et sa valeur ASCII dans Hexadecimal. Les fonctions php "urlencode" et "rawurlencode" font ce travail pour vous.

1
Nino Filiu

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

0
geowa4