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:
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.
¿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
@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 –