Caracteres permitidos en el parámetro GET

¿Qué caracteres están permitidos en los parámetros GET sin encoding 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!

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

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 🙂

Caracteres alfanuméricos y todos

~ - _ . ! * ' ( ) ,

son válidos dentro de una URL.

Todos los demás caracteres deben estar codificados.

Todas las reglas relativas a la encoding 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 encoding porcentual, también conocida como encoding 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 encoding.

Hay 66 caracteres sin reserva que no necesitan encoding: 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.

La pregunta pregunta qué caracteres están permitidos en los parámetros GET sin encoding o escapándolos .

De acuerdo con RFC3986 (syntax general de URL) y RFC7230, sección 2.7.1 (syntax 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, sección 3.4 aconseja contra la encoding porcentual “/” “? caracteres.

a veces es mejor para la usabilidad evitar el porcentaje de encoding 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 encoding 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 encoding de otros caracteres está permitida pero no es necesaria.

"." | "!" | "~" | "*" | "'" | "(" | ")" "." | "!" | "~" | "*" | "'" | "(" | ")" también son aceptables [RFC2396] . Realmente, cualquier cosa puede estar en un parámetro GET si está codificada correctamente.