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!

¿Fue útil?

Solución

caracteres

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top