2010-01-12 9 views
88

Estamos diseñando un sistema de URL que especificará las secciones de la aplicación como palabras separadas por barras diagonales. Específicamente, este es en GWT, por lo que las partes pertinentes de la URL estarán en el hash (que será interpretado por una capa de controlador en el lado del cliente):¿Es seguro un colon para el uso amigable de URL?

http://site/gwturl#section1/section2 

Algunas secciones pueden necesitar atributos adicionales, que nos gustaría especificar con un :, para que las partes de la sección de la URL no sean ambiguas. El código se divide en primer lugar en /, a continuación, en :, así:

http://site/gwturl#user:45/comments 

Por supuesto, estamos haciendo esto para url de uso, por lo que nos gustaría para asegurarse de que ninguno de estos personajes, que cabe significado especial será una URL codificada por los navegadores, o cualquier otro sistema, y ​​terminar con una URL como esta:

http://site/gwturl#user%3A45/comments <--- BAD 

es usar los dos puntos de esta manera segura (y me refiero no será codificado automáticamente) para navegadores, sistemas de marcadores, incluso código JavaScript o Java?

+0

Tal vez sea una buena idea especificar (con más claridad) que utilice las direcciones URL en el lado del cliente solamente? Dado que muchas de las respuestas (al igual que las mías) parecen suponer que va a enviar la URL a un servidor que usa HTTP. – Veger

+0

Editado para agregar aclaraciones sobre el uso del fragmento en el lado del cliente. – Nicole

+0

Tengo curiosidad: después de 10 meses, ¿este esquema de URL ha funcionado para usted? Estoy considerando usar el mismo esquema. –

Respuesta

66

Recientemente wrote un codificador de URL, así que esto es bastante fresco en mi mente.

http://site/gwturl#user:45/comments

Todos los personajes de la fragment part (user:45/comments) son perfectamente legal para RFC 3986 URI.

Las partes pertinentes de la ABNF:

fragment  = *(pchar/"/"/"?") 
pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 
unreserved = ALPHA/DIGIT/"-"/"."/"_"/"~" 
pct-encoded = "%" HEXDIG HEXDIG 
sub-delims = "!"/"$"/"&"/"'"/"("/")" 
       /"*"/"+"/","/";"/"=" 

Aparte de estas restricciones, la parte fragmento carece de una estructura definida más allá de la aplicación de la da. El esquema, http, solo dice que no envía esta parte al servidor.


EDIT:

D'oh!

A pesar de mis afirmaciones acerca de la especificación URI, irreputable proporciona la respuesta correcta cuando he points out que la especificación HTML 4 restringe los nombres/identificadores elemento.

Tenga en cuenta que las reglas del identificador son changing in HTML 5. Las restricciones de URI se seguirán aplicando (al momento de escribir, hay algunos problemas sin resolver sobre el uso de URI por parte de HTML 5).

+0

Creo que estás en algo, ¿puedes explicar esto un poco más? No enviar esto al servidor no es un problema, ya que estamos usando GWT. Simplemente no estoy seguro de tener clara la sintaxis especificada en la sección que citó. – Nicole

+0

Pero ':' es un gen-delim, no un sub-delim. – bobince

+1

El punto y coma es legal para un pchar, por lo tanto, si está en sub-delim o gen-delim no es un problema – Veger

6

No contaría con eso. Es probable que muchos usuarios-agentes lo codifiquen como %3A.

+5

* Muchas * agentes de usuario? – arbales

+1

@arbales: Sí. Algunos usuarios-agentes menos conformes dejarán las urls incumplidas sin adornos. – Asaph

4

De URLEncoder javadoc:

Para obtener más información acerca de HTML forma codificación, consulte el código HTML specification.

Cuando se codifica una cadena, se aplican las siguientes reglas:

  • Los caracteres alfanuméricos "a" a través de "z", "A" a través de "Z" y "0" a "9" siguen siendo lo mismo.
  • Los caracteres especiales ".", "-", "*" y "_" siguen siendo los mismos.
  • El espacio carácter "" se convierte en un signo más "+".
  • Todos los demás caracteres son inseguros y se convierten primero en uno o más bytes utilizando algún esquema de codificación . Entonces cada byte se representa por la cadena de 3 caracteres "% xy", donde xy es la representación hexadecimal de dos dígitos del byte. El esquema de codificación recomendado para usar es UTF-8. Sin embargo, por razones de compatibilidad , si no se especifica una codificación , se utiliza la codificación predeterminada de la plataforma.

Es decir, : no es seguro.

-1

Colon no es seguro. See here

+0

Esa página no motiva por qué no son seguros. El [RFC2396] referenciado (http://www.rfc-editor.org/rfc/rfc2396.txt) tampoco dice que deba escaparse. Además, el script del convertidor proporcionado no lo codifica (en Chrome 9 de todos modos). –

3

No veo que Firefox o IE8 codifiquen algunos de los Wikipedia URLs que incluyen el personaje.

+1

Opera también mantiene el punto y coma, pero contar con dicho comportamiento no es bueno para hacer – Veger

+1

Renesis está hablando del fragmento de URL y no de la ruta de URL. – Gumbo

+0

Wikipedia fue uno de mis pensamientos al escribir esta pregunta. ¿Su uso de dos puntos es técnicamente inválido/inseguro entonces? Normalmente veo (y) en las URL de Wikipedia codificadas, pero nunca en el colon, lo que me dejó un poco confundido. – Nicole

-4

No es un carácter seguro y se utiliza para distinguir qué puerto se conecta a cuando es posible después de su nombre de dominio

3

Los puntos se utilizan como la división entre el nombre de usuario y la contraseña si un protocolo requiere autenticación.

49

Además del análisis de McDowell en el estándar URI, recuerde también que el fragmento debe ser un nombre de ancla HTML válido. Según http://www.w3.org/TR/html4/types.html#type-name

ID y NAME tokens debe comenzar con una letra ([A-Za-z]) y puede ser seguido por cualquier número de letras, dígitos ([0-9]), guiones ("-"), subraya ("_"), dos puntos (":") y puntos (".").

Así que estás de enhorabuena. ":" está explícitamente permitido. Y nadie debería "%" - escapar, no solo porque "%" es ilegal char allí, sino también porque el fragmento coincide mucho con el nombre de anclaje char-by-char, por lo tanto, ningún agente debe tratar de atenuarse con ellos de todos modos.

Sin embargo, usted tiene que probarlo. Los estándares web no se siguen estrictamente, a veces los estándares son contradictorios. Por ejemplo, HTTP/1.1 RFC 2616 no permite la cadena de consulta en la URL de solicitud, mientras que HTML construye una al enviar un formulario con el método GET. Cualquiera que sea implementado en el mundo real gana al final del día.

+1

@ irrefutable, sí, tiene toda la razón. – McDowell

40

MediaWiki y otros motores de wiki utilizan dos puntos en sus URL para designar espacios de nombres, aparentemente sin mayores problemas.

por ejemplo http://en.wikipedia.org/wiki/Template:Welcome

+19

Respuesta más relevante. Todos sabemos que lo que hay en las especificaciones tiene poco que ver con la realidad en el desarrollo web. No obtendrá una garantía de "seguridad" mucho mejor que "uno de los 10 mejores sitios web del mundo". –

Cuestiones relacionadas