query por pasar especiales escape encoded caracteres parameters get special-characters character

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