Pregunta

¿Se permiten corchetes en las URL?

Me di cuenta que Apache commons HttpClient (3.0.1) arroja una IOException, pero wget y Firefox aceptan corchetes.

Ejemplo de URL:

http://example.com/path/to/file[3].html

Mi cliente HTTP encuentra este tipo de URL, pero no estoy seguro de si debo parchear el código o generar una excepción (como debería ser en realidad).

¿Fue útil?

Solución

RFC 3986 estados

Un host identificado por una dirección literal del protocolo de Internet, versión 6 [RFC3513] o posterior, se distingue al encerrar el literal IP dentro de los soportes cuadrados ([" y "]).Este es el único lugar donde los caracteres de soporte cuadrado están permitidos en la sintaxis de URI.

Por lo tanto, en teoría, no debería ver dichos URI en la naturaleza, ya que deberían llegar codificados.

Otros consejos

Sé que esta pregunta es un poco antigua, pero solo quería señalar que PHP usa corchetes para pasar matrices en una URL.

http://www.example.com/foo.php?bar[]=1&bar[]=2&bar[]=3

En este caso $_GET['bar'] contendrá array(1, 2, 3).

Es casi seguro que cualquier navegador o software compatible con la web que acepte URL y no genere una excepción cuando se introducen caracteres especiales codificará los caracteres especiales detrás de escena.Las llaves, corchetes, espacios, etc. tienen formas codificadas especiales de representarlos para no producir conflictos.Según las respuestas anteriores, la forma más segura de tratarlos es codificarlos en URL antes de entregárselos a algo que intentará resolver la URL.

Prácticamente los únicos caracteres no permitidos en las rutas son # y ?ya que significan el final del camino.

El uri rfc tendrá la respuesta definitiva:

http://www.ietf.org/rfc/rfc1738.txt

Inseguro:

Los personajes pueden resultar inseguros por varias razones.El carácter espacial no es seguro porque los espacios significativos pueden desaparecer y se pueden introducir espacios insignificantes cuando las URL se transcriben o son compatibles con el tratamiento de programas de procesamiento de palabras.Los personajes "<" y ">" son inseguros porque se usan como delimitadores alrededor de las URL en texto libre;La marca de cotización ("" ") se usa para delimitar URL en algunos sistemas.El personaje "#" es inseguro y siempre debe codificarse porque se usa en la red mundial y en otros sistemas para delimitar una URL de un identificador de fragmento/ancla que podría seguirla.El personaje "%" es inseguro porque se usa para codificaciones de otros personajes.Otros personajes son inseguros porque se sabe que las puertas de enlace y otros agentes de transporte a veces modifican tales caracteres.Estos personajes son "{", "}", "|", "", "^", "~", [", "] y "` ".

Todos los caracteres no seguros siempre deben estar codificados dentro de una URL.Por ejemplo, el personaje "#" debe estar codificado dentro de las URL, incluso en sistemas que normalmente no se ocupan de los identificadores de fragmentos o de anclaje, de modo que si la URL se copia en otro sistema que las usa, no será necesario cambiar el Codificación de URL.

La respuesta es que ellos debería estar codificados en hexadecimal, pero conociendo la ley de Postel, la mayoría de las cosas los aceptarán palabra por palabra.

Para utilizar la clase común HttpClient, desea consultar la clase org.apache.commons.httpclient.util.URIUtil, específicamente el método encode().Úselo para codificar URI la URL antes de intentar recuperarla.

StackOverflow parece no codificarlos:

https://stackoverflow.com/search?q=square+brackets+[url]

Lo mejor es codificarlos mediante URL, ya que claramente no son compatibles con todos los servidores web.A veces, incluso cuando existe un estándar, no todos lo siguen.

De acuerdo con la especificación de URL, los corchetes no son caracteres de URL válidos.

Aquí están los fragmentos relevantes:

Los personajes "nacionales" y "puntuación" no aparecen en ninguna producción y, por lo tanto, pueden no aparecer en las URL.
Nacional {| } | VLine | [| ] | | ^ | ~
Puntuación <| >

Corchetes [ y ] En las URL no suelen ser compatibles.

Reemplácelos por %5B y %5D:

  • Usando una línea de comando, el siguiente ejemplo se basa en bash y sed:

    url='http://example.com?day=[0-3][0-9]'
    encoded_url="$( sed 's/\[/%5B/g;s/]/%5D/g' <<< "$url")"
    
  • Usando Java URLEncoder.encode(String s, String enc)

  • Usando PHP rawurlencode() o urlencode()

    <?php
    echo '<a href="http://example.com/day/',
        rawurlencode('[0-3][0-9]'), '">';
    ?>
    

    producción:

    <a href="http://example.com/day/%5B0-3%5D%5B0-9%5D">
    

    o:

    <?php
    $query_string = 'day=' . urlencode('[0-3][0-9]') .
                    '&month=' . urlencode('[0-1][0-9]');
    echo '<a href="http://example.com?',
          htmlentities($query_string), '">';
    ?>
    
  • Usando tu lenguaje de programación favorito...Amplíe esta respuesta publicando un comentario o editando directamente esta respuesta para agregar la función que usa desde su lenguaje de programación ;-)

Para más detalles, consulte el RFC 3986 especificando la sintaxis de la URL.El Apéndice A es sobre %-encoding en la cadena de consulta (corchetes como pertenecientes a “gen-delims” ser %-encoded).

Los corchetes se consideran inseguros, pero la mayoría de los navegadores los analizarán correctamente.Dicho esto, es mejor reemplazar los corchetes con otros caracteres.

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