Protegiendo un href = '{{my_model.some_url}}' en Django

3

En mi plantilla de Django, tengo un enlace como este:

<a href='{{ my_model.some_url }}'>

El bit some_url es un Django URLField en el que un usuario puede influir.

¿Esto puede ser explotado de alguna manera? (Lo que viene a la mente es incluir una cita en la URL y luego un HTML arbitrario).

¿Qué puedo hacer para proteger este código?

    
pregunta Ram Rachum 04.03.2014 - 11:49
fuente

1 respuesta

2

En general, hay esquemas de URL válidos que son peligrosos. Lo más obvio es que javascript: , que como pseudo-URL no se refiere a una nueva ubicación, sino a un comando para ejecutar en la página actual. Si se agrega una URL javascript: a su página, significa que tiene un problema de scripts entre sitios.

También hay otros alias de scripting ( vbscript: , mocha: et al), así como data: y cualquier número de manejadores de protocolo arbitrarios que el software de terceros pueda haber instalado en el cliente. Por lo general, es necesario incluir en la lista blanca los esquemas de URL.

El URLValidator predeterminado de Django para URLField hace esto, permitiendo solo los enlaces http, https, ftp y ftps, por lo que siempre que no haya reemplazado los validadores, debería estar bien. (Es posible que desee hacerlo, si ese no es el conjunto de esquemas que desea). Si tiene otros medios para rellenar el campo some_url que no pasa por el validador / campo normal, deberá hacer Seguro que también está validado.

  

(Lo que viene a la mente es incluir una cita en la URL y luego un código HTML arbitrario).

Siempre y cuando no hayas deshabilitado autoescape , el escape de HTML predeterminado que proporciona {{...}} templating lo impide (codifica correctamente las comillas simples a &#39; ).

    
respondido por el bobince 04.03.2014 - 13:42
fuente

Lea otras preguntas en las etiquetas