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!
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
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.
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 :)
caractères Alphanumériques et tous
~
-
_
.
!
*
'
(
)
,
sont valides dans une URL.
Tous les autres caractères doivent être encodés.
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.
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.