2012-07-15 5 views
17

¿Es realmente seguro/válido utilizar sintetizador de matriz multidimensional en la cadena de consulta de URL?¿Es válida la sintaxis de matriz que utiliza corchetes en cadenas de consulta de URL?

http://example.com?abc[]=123&abc[]=456 

Parece que funciona en todos los navegadores y siempre me pareció que estaba bien usar, pero accodring a un comentario en este artículo que no es: http://www.456bereastreet.com/archive/201008/what_characters_are_allowed_unencoded_in_query_strings/#comment4

me gustaría escuchar una segunda opinión.

+0

¿Qué es "multidimensional" en esto? ¿O se refiere a los get vars que se representan como una matriz en un lenguaje de scripting del lado del servidor? – arkascha

+0

@arkascha sí, me refiero a una cadena de consulta como esta '? A [b] [c] [d] [e] = f', la secuencia de comandos del lado del servidor la trata como una matriz multidimensional –

Respuesta

12

La respuesta no es simple.

Lo siguiente se extrae de la sección 3.2.2 de RFC 3986:

Un anfitrión identificado por una dirección literal de Protocolo de Internet, versión 6
[RFC3513] o más tarde, se distingue por que encierra el IP literal
entre corchetes ("[" y "] "). Este es el único lugar donde
caracteres de corchetes cuadrados están permitidos en la sintaxis de URI.

Este parece responder a la pregunta afirmando rotundamente que corchetes no se permite ninguna otra parte del URI. Pero hay una diferencia entre un carácter de corchetes y un porcentaje de corchetes codificados.

La siguiente es extraída del principio de la sección 3 de la RFC 3986:

  1. Componentes de sintaxis

    La sintaxis genérica URI consiste en una secuencia jerárquica de
    componentes conocidos como esquema, autoridad, ruta, consulta y fragmento
    .

    URI = scheme ":" hier-part ["?" consulta] [fragmento de "#"]

Así que la "consulta" es un componente de la "URI".

La siguiente es extraído de la sección 2.2 de RFC 3986:

2,2. Caracteres reservados

Los URI incluyen componentes y subcomponentes que están delimitados por
caracteres en el conjunto "reservado". Estos caracteres se llaman
"reservado", ya que pueden (o no pueden) ser definido como delimitadores por
la sintaxis genérica, por cada una sintaxis específica del esquema, o por el sintaxis
específico de la implementación del algoritmo de eliminación de referencias de un URI.
Si los datos de un componente de URI entrarán en conflicto con un propósito reservado del carácter
como delimitador, los datos en conflicto deben
estar codificados en porcentajes antes de que se forme el URI.

reserved = gen-delims/sub-delims 

    gen-delims = ":"/"/"/"?"/"#"/"["/"]"/"@" 

    sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

corchetes cuadrados Así que pueden aparecer en una cadena de consulta, pero sólo si están codificados por ciento. A menos que se no, que se explicarán más abajo en la sección 2.2:

URI aplicaciones que producen deben octetos de datos por ciento a codificar que
corresponden a caracteres en el conjunto reservado a menos que estos caracteres
se permite específicamente por el Esquema URI para representar datos en ese componente
.Si un carácter reservado se encuentra en un componente URI y el papel
ninguna delimitación es conocido por ese carácter, entonces debe ser interpretado como
que representa el octeto de datos correspondiente a la codificación que
del personaje en US-ASCII.

Así pues corchetes sólo se permiten en el subcomponente "host", que "deberían" ser ciento codificados en otros componentes y subcomponentes, y en este caso en el componente de "consulta", a menos que el RFC 3986 permite explícitamente sin codificar corchetes para representar datos en el componente de consulta, que no es.

Sin embargo, si una "aplicación que produce URI" no puede hacer lo que "debería" hacer, dejando los corchetes no codificados en la consulta, los lectores del URI no deben rechazar el URI por completo. En cambio, los corchetes deben considerarse como pertenecientes a los datos del componente de consulta, ya que no se usan como delimitadores en ese componente.

Por eso, por ejemplo, no es una violación de RFC 3986 cuando PHP acepta corchetes no codificados y porcentualmente codificados como caracteres válidos en una cadena de consulta, e incluso les asigna un propósito especial. Sin embargo, parecería que los autores que intentan aprovecharse de esta laguna mediante el porcentaje de codificación no porciento están en violación de RFC 3986.

+0

"Los corchetes pueden aparecer en la cadena de consulta si están codificados en porcentaje, a menos que no sean" xD ". muy buena respuesta. –

11

De acuerdo con el RFC 3986, el Query component de una URL tiene la siguiente gramática:

*(pchar/"/"/"?") 

De appendix A del mismo RFC:

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
[...] 
pct-encoded = "%" HEXDIG HEXDIG 

unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
[...]  
sub-delims = "!"/"$"/"&"/"'"/"("/")" 
      /"*"/"+"/","/";"/"=" 

Mi interpretación de esto es que cualquier cosa que ISN' t:

ALPHA/DIGIT/"-"/"."/"_"/"~"/
    "!"/"$"/"&"/"'"/"("/")"/
    "*"/"+"/","/";"/"="/":"/"@" 

... deben estar codificadas por PCT, es decir, por ciento codificado. Por lo tanto, [ y ] deberían estar codificados en porcentaje para seguir a RFC 3986.

+3

Tienes razón, pero ayúdame siguiendo con esa interpretación. El extracto que diste es incompleto, 'reservado' nunca se vuelve a mencionar aquí. Entonces la definición no tiene sentido así. A medida que lo leo, los corchetes se definen como caracteres reservados con un significado especial (no estoy seguro de cuál), por lo tanto, no deberían escaparse si quiere expresar ese significado. Si escapas em simplemente transfieres una cadena que contiene corchetes como valor del parámetro. Entonces me pregunto: bueno, ¿qué es realmente el significado de los corchetes que se reservan caracteres en urls? – arkascha

+0

Dejé la definición de 'reserved' y' gen-delims' en la cita para que sea más fácil ver cómo '[]' están clasificados en la gramática: tenga en cuenta que solo un subconjunto de 'reserved' es' pchar'. –

+0

Los corchetes están reservados para los literales de direcciones IP v6. http://tools.ietf.org/html/rfc3986#appendix-D.1, http://tools.ietf.org/html/rfc2732#section-2 –

1

Siempre tuve la tentación de hacer ese tipo de consultas cuando tuve que pasar una matriz, pero me alejé de ella. El motivo es:

  • No está definido como borrado en RFC.
  • Diferentes idiomas pueden interpretarlo de manera diferente.

usted tiene un par de opciones para pasar una matriz: (? JSON puede ser)

  • codificar la representación de cadena de la matriz
  • tienen parámetros como "val1 = bla & val2 = bla & .. "o algo así.

Y si está seguro sobre el lenguaje que está utilizando, puede (de forma segura) va para el tipo de cadena de consulta que tiene (Sólo que es necesario% -encode [] también).

+0

Entonces esta será una URL multiarray válida? '? abc% 5B% 5D = 123 & abc% 5B% 5D = 456'. Muy feo, veo por qué raramente se usa –

+1

Eso dependería de cómo lo trate el idioma. Lo mejor es mantenerse alejado de eso. Para ser un poco más precisos, son solo pares clave-valor. Nada más, nada menos y no hay "matriz" en él. – SuperSaiyan

1

Mi comprensión de que los corchetes no son ciudadanos de primera clase de todos modos. Esta es la cita: http://tools.ietf.org/html/rfc1738

Otros personajes son inseguros debido a las pasarelas y otros agentes de transporte se conocen a veces modificar dichos caracteres. Estos caracteres son "{", "}", "|", "\", "^", "~", "[", "]" y "` ".

Cuestiones relacionadas