Caractères autorisés dans les paramètre GET
Quels sont les caractères autorisés dans les paramètres GET sans codage ou d'y échapper? Je veux dire quelque chose comme ceci:
http://www.example.org/page.php?name=XYZ
Que pouvez-vous avoir là, au lieu 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?
J'espère que vous pourrez m'aider. Merci à l'avance!
- double possible de HTTP URL caractères autorisés dans les noms de paramètres
- Pas de véritable dupe, comme dans les autres question s'échapper est nécessaire, par opposition à ici, où est aimé être évitée.
Vous devez vous connecter pour publier un commentaire.
Il y a les caractères réservés, qui ont réservé un sens, ce sont des délimiteurs —
:/?#[]@
— et subdelimiters —!$&'()*+,;=
Il y a aussi un ensemble de caractères appelée sans réserve caractères — caractères alphanumériques et
-._~
— qui ne sont pas encodés.Cela signifie, que quelque chose qui ne lui appartient pas sans réserve à l'ensemble de caractères est censé être codé -%, quand ils n'ont pas de signification particulière (par exemple, lorsqu'il est passé comme une partie de
GET
paramètre).Voir aussi RFC3986: Identificateur de Ressource Uniforme (URI): Syntaxe Générique
urlencode()
je n'ai aucune idée si cela fonctionne correctement, il n'est pas toujours le cas avec les fonctions PHP - mais si c'est le cas alors oui, vous pouvez tester avec ça 😉 Comme je l'ai dit - échapper à tout, mais sans réserve.&
est également autorisé, mais il a une signification spéciale, alors je soupçonne ils ont répondu à une autre question./
et?
. Je cherchais ce parce que Swift n'échappe pas à ces dans leurstringByAddingPercentEncodingForURLQueryParameter
méthode! (Correctement, apparemment)La question demande quels sont les caractères autorisés dans les paramètres GET sans codage ou d'échapper.
Selon RFC3986 (générale de la syntaxe d'URL) et RFC7230, la section 2.7.1 (HTTP/S, la syntaxe de l'URL) les seuls personnages dont vous avez besoin pour cent-encoder sont ceux à l'extérieur de l'extérieur de la requête ensemble, voir la définition ci-dessous.
Cependant, il existe d'autres caractéristiques, comme le HTML5, Des formulaires Web, et le obsolètes Indexé de recherche, recommandation du W3C. Ces documents ajouter une signification particulière pour certains caractères, notamment, à des symboles comme = & + ;.
D'autres réponses ici suggèrent que la plupart des caractères réservés doivent être codées, y compris les "/" "?". Ce n'est pas correct. En fait, RFC3986 la section 3.4 de l' déconseille pour cent de codage "/" "?" caractères.
RFC3986 définit composant de requête comme:
La conclusion est que XYZ partie doit encoder:
À moins que des symboles spéciaux = & ; sont clé=valeur séparateurs.
Encodage des autres personnages est autorisée, mais pas nécessaire.
De RFC 1738 sur laquelle les caractères sont autorisés dans les Url:
Les caractères réservés sont ";", "/", "?", ":", "@", "=" et "&", ce qui signifie que vous auriez besoin de les encoder, si vous souhaitez les utiliser.
Caractères alphanumériques et tous
~
-
_
.
!
*
'
(
)
,
sont valables dans une URL.
Tous les autres caractères doivent être encodés.
J'ai fait un test à l'aide de la barre d'adresse de Chrome et un
$QUERY_STRING
en bash, et observé ce qui suit:~!@$%^&*()-_=+[{]}\|;:',./?
etgrave (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 🙂
Toutes les règles concernant l'encodage des URIs (qui contient des Urnes et des Url) sont précisées dans la RFC1738 et la RFC3986, voici un TL;DR de ces documents longs et ennuyeux:
Pour cent de codage, aussi connu comme l'encodage de l'URL, est un mécanisme de codage de l'information dans un URI dans certaines circonstances. Le nombre de caractères autorisés dans un URI sont réservés ou sans réserve. Les caractères réservés sont ces personnages qui ont parfois une signification particulière, mais ils ne sont pas les seuls caractères qui a besoin de codage.
Il y a 66 sans réserve des caractères qui n'a pas besoin de n'importe quel encodage:
abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
Il y a 18 caractères réservés qui doit être codée:
!*'();:@&=+$,/?#[]
, et tous les autres caractères doivent être encodés.Pour cent de l'encodage d'un caractère, il suffit de concaténer "%" et sa valeur ASCII en
hexadécimal. Les fonctions php "urlencode" et "rawurlencode" faire ce travail pour vous.
"." | "!" | "~" | "*" | "'" | "(" | ")"
sont également acceptables [RFC2396]. Vraiment, n'importe quoi peut être un paramètre GET, si elle est correctement codé.