Los caracteres permitidos en el parámetro GET
-
12-09-2019 - |
Pregunta
¿Qué personajes están permitidos en parámetros GET y sin codificación o escapar de ellos? Me refiero a algo como esto:
http://www.example.org/page.php?name=XYZ
¿Qué se puede tener allí en lugar de XYZ? Creo que sólo los siguientes caracteres:
- a-z (A-Z)
- 0-9
- -
- _
¿Es esta la lista completa o hay caracteres adicionales permitido?
Espero que me puedan ayudar. Gracias de antemano!
Solución
Hay reservados , que tienen un significado reservadas, los delimitadores son - :/?#[]@
- y subdelimiters - !$&'()*+,;=
También hay un conjunto de caracteres llamado Los caracteres no reservados - alfanuméricos y -._~
-. Que no se van a codificar
Esto significa, que cualquier cosa que no pertenece a caracteres no reservados establecidos se supone que son codificados en%, cuando no tienen un significado especial (por ejemplo, cuando se pasa como parte del parámetro GET
) .
RFC3986: Uniform Resource Identifier (URI): Sintaxis Genérica
Otros consejos
La pregunta se refiere a que los personajes son permitido en parámetros GET y sin codificación o escapar de ellos .
Según RFC3986 (sintaxis general URL) y RFC7230, sección 2.7.1 (HTTP / S sintaxis URL) los únicos personajes que necesita por ciento a codificar son aquellos fuera de la consulta conjunto, ver la definición más abajo.
Sin embargo, existen especificaciones adicionales como HTML5, formularios web, y lo obsoleto indexada búsqueda, recomendación del W3C. Esos documentos dan un significado especial a algunos personajes en particular, a símbolos como = & +;.
Otras respuestas aquí sugieren que la mayoría de los caracteres reservados deben ser codificados, incluyendo "/" "?". Eso no es correcto. De hecho, RFC3986, sección 3.4 desaconseja código porciento "/" " ?" personajes.
a veces es mejor para la facilidad de uso para evitar porcentaje que codifica esos caracteres.
RFC3986 define componente de consulta como:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Un mecanismo por ciento-codificación se utiliza para representar un octeto de datos en una componente cuando el personaje correspondiente de ese octeto está fuera del permitido conjunto o está siendo utilizado como un delimitador de, o dentro de, la componente.
La conclusión es que XYZ parte debe codificar:
special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters
A menos símbolos especiales = &; son clave = valor separadores.
se permite que codifican otros personajes, pero no es necesario.
RFC 1738 en la que se permiten caracteres en las URL:
Sólo caracteres alfanuméricos, los caracteres especiales "$ -_. +! * '()", Y caracteres reservados utilizados para sus fines reservados pueden ser usados sin codificar dentro de un URL.
Los caracteres reservados son ";", "/", ":", "@", "=" y "&", lo que significa que tendría que URL codificarlos si desea utilizarlos "?" .
Los caracteres alfanuméricos y todos
~
-
_
.
!
*
'
(
)
,
son válidas dentro de una URL.
Todos los demás caracteres deben ser codificados.
Hice una prueba utilizando la barra de direcciones de Chrome y una $QUERY_STRING
en bash, y observaron los siguientes:
~!@$%^&*()-_=+[{]}\|;:',./?
y grave (backtick)
se pasan a través como texto sin formato.
,
"
, <
y >
se convierten a %20
, %22
, %3C
y %3E
respectivamente.
#
es ignorado, ya que es utilizado por Ye Olde anclaje .
En lo personal, yo diría que morder la bala y codificar con base 64:)
Todas las normas relativas a la codificación de URI (que contiene los URN y URLs) se especifican en el RFC1738 y RFC3986 el, aquí hay un TL; DR de estos documentos largos y aburridos:
Porcentaje-codificación, también conocida como codificación URL, es un mecanismo para la codificación de información en un URI en determinadas circunstancias. Los caracteres permitidos en un URI son ya sea reservada o no reservada. Caracteres reservados son aquellos personajes que a veces tienen un significado especial, pero no son los únicos personajes que necesitan codificación.
Hay 66 caracteres no reservados que no necesita ningún tipo de codificación:
abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
Hay 18 caracteres reservados que debe ser codificado: !*'();:@&=+$,/?#[]
, y todos los demás caracteres deben ser codificados
Para ciento a codificar un personaje, simplemente concatenar "%" y su valor ASCII hexadecimal. Las funciones PHP "urlencode" y "rawurlencode" hacer este trabajo para usted.
"." | "!" | "~" | "*" | "'" | "(" | ")"
son también aceptables [RFC2396] . En realidad, cualquier cosa puede ser en un parámetro GET si se codifica correctamente.