parameters - por - url escape chars
Caracteres permitidos en el parĂ¡metro GET (7)
¿Qué caracteres están permitidos en los parámetros GET sin codificación o escapándolos? Quiero decir algo como esto:
http://www.example.org/page.php?name=XYZ
¿Qué puedes tener allí en lugar de XYZ? Creo que solo los siguientes personajes:
- az (AZ)
- 0-9
- -
- _
¿Es esta la lista completa o hay caracteres adicionales permitidos?
Espero que puedas ayudarme. ¡Gracias por adelantado!
Caracteres alfanuméricos y todos
~
-
_
.
!
*
''
(
)
,
son válidos dentro de una URL.
Todos los demás caracteres deben estar codificados.
De RFC 1738 en el que los caracteres están permitidos en las URL:
Solo los caracteres alfanuméricos, los caracteres especiales "$ -_. +! * ''()," Y los caracteres reservados utilizados para sus fines reservados se pueden utilizar sin codificar dentro de una URL.
Los caracteres reservados son ";", "/", "?", ":", "@", "=" Y "&", lo que significa que necesitaría codificarlos mediante URL si desea usarlos.
Hice una prueba usando la barra de direcciones de Chrome y un $QUERY_STRING
en bash, y observé lo siguiente:
~!@$%^&*()-_=+[{]}/|;:'',./?
y grave (backtick)
pasan a través de texto plano.
,
"
, <
y >
se convierten a %20
, %22
, %3C
y %3E
respectivamente.
#
se ignora, ya que es usado por ye olde anchor .
Personalmente, diría que muerde la bala y codifica con base64 :)
La pregunta pregunta qué caracteres están permitidos en los parámetros GET sin codificación o escapándolos .
De acuerdo con RFC3986 (sintaxis general de URL) y RFC7230, sección 2.7.1 (sintaxis de URL HTTP / S), los únicos caracteres que necesita para codificar porcentualmente son aquellos fuera del conjunto de consulta , consulte la definición a continuación.
Sin embargo, hay especificaciones adicionales como HTML5, formularios web y la búsqueda indexada obsoleta , recomendación de W3C. Esos documentos agregan un significado especial a algunos personajes notablemente, a símbolos como = & +; .
Otras respuestas aquí sugieren que la mayoría de los caracteres reservados deberían estar codificados, incluyendo "/" "?". Eso no es correcto De hecho, RFC3986 aconseja contra la codificación porcentual "/" "? caracteres.
a veces es mejor para la usabilidad evitar el porcentaje de codificación de esos caracteres.
RFC3986 define el componente de consulta como:
query = *( pchar / "/" / "?" )
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "''" / "(" / ")" / "*" / "+" / "," / ";" / "="
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
Un mecanismo de codificación porcentual se usa para representar un octeto de datos en un componente cuando el carácter correspondiente de ese octeto está fuera del conjunto permitido o se está utilizando como un delimitador de, o dentro de, el componente.
La conclusión es que la parte XYZ debe codificar:
special: # % = & ;
Space
out of query set: [ ]
non ASCII encodable characters
A menos que los símbolos especiales = &; son key = value separators.
La codificación de otros caracteres está permitida pero no es necesaria.
Todas las reglas relativas a la codificación de URI (que contiene URN y URL) están especificadas en el RFC1738 y el RFC3986, aquí hay un TL; DR de estos documentos largos y aburridos:
La codificación porcentual, también conocida como codificación URL, es un mecanismo para codificar información en un URI bajo ciertas circunstancias. Los caracteres permitidos en un URI son reservados o no reservados. Los caracteres reservados son aquellos caracteres que a veces tienen un significado especial, pero no son los únicos caracteres que necesitan codificación.
Hay 66 caracteres sin reserva que no necesitan codificación: abcdefghiklmopqrstuvwABCDEFGHIKLMOPQRSTUVWXYZ0123456789-_.~
Hay 18 caracteres reservados que deben codificarse !*''();:@&=+$,/?#[]
, Y todos los demás caracteres deben estar codificados.
Para codificar porcentualmente un carácter, simplemente concatenar "%" y su valor ASCII en hexadecimal. Las funciones php "urlencode" y "rawurlencode" hacen este trabajo por usted.
"." | "!" | "~" | "*" | "''" | "(" | ")"
"." | "!" | "~" | "*" | "''" | "(" | ")"
también son aceptables [RFC2396] . Realmente, cualquier cosa puede estar en un parámetro GET si está codificada correctamente.
Hay caracteres reservados , que tienen un significado reservado, esos son delimitadores - :/?#[]@
- y subdelimitadores - !$&''()*+,;=
También hay un conjunto de caracteres llamados caracteres no -._~
: alfanuméricos y -._~
- que no deben codificarse.
Esto significa que cualquier cosa que no pertenezca a un conjunto de caracteres sin reservas se supone que está codificada en%, cuando no tienen un significado especial (por ejemplo, cuando se pasa como parte del parámetro GET
) .
Consulte también RFC3986: Identificador Uniforme de Recursos (URI): Sintaxis Genérica