Notas de lanzamiento de Django 1.6.6

Agosto 20, 2014

Django 1.6.6 resuelve varios problemas de seguridad y errores en 1.6.5.

reverse() podría generar URLs que apuntan a otros hosts

En ciertas situaciones, la resolución de URL podría generar URLs relativas al esquema (URLs que comienzan con dos slashes), lo que podría redirigir inesperadamente a un usuario a un host diferente. Un atacante podría explotar esto, por ejemplo, redirigiendo a los usuarios a un sitio de phishing diseñado para pedirles las contraseñas.

Para remediar esto, la resolución de URL ahora asegura que ninguna URL comienza con dos slashes (//), reemplazando el segundo slash con su equivalente codificado en URL (%2F). Esta aproximación garantiza que los semánticos sigan siendo los mismos, mientras hace que la URL sea relativa al dominio y no al esquema.

Denegación de servicio por subida de archivo

Antes de esta versión, el manejo de subidas de archivos en Django en su configuración predeterminada puede degradarse a producir un número enorme de llamadas del sistema os.stat() cuando se sube un nombre de archivo duplicado. Dado que stat() puede invocar IO, esto puede producir una lentitud dependiente de datos que empeora gradualmente con el tiempo. El resultado neto es que, dado suficiente tiempo, un usuario con la capacidad de subir archivos puede causar un rendimiento pobre en el manipulador de subida, lo que eventualmente hace que se vuelva muy lento simplemente al subir archivos de 0 bytes. En este punto, incluso una conexión a Internet lenta y pocas solicitudes HTTP serían suficientes para hacer inaccesible un sitio.

Hemos remediado el problema cambiando el algoritmo para generar nombres de archivo si ya existe uno con el nombre subido. Storage.get_available_name() ahora agrega un guión bajo más una cadena alfanumérica aleatoria de 7 caracteres (por ejemplo, "_x3a1gho"), en lugar de iterar a través de un guión bajo seguido de un número (por ejemplo, "_1", "_2", etc.).

RemoteUserMiddleware: robo de sesión

Cuando se utiliza el RemoteUserMiddleware y el RemoteUserBackend, una modificación al encabezado REMOTE_USER entre solicitudes sin un cierre de sesión intermedio podría resultar en la sesión anterior del usuario siendo co-optada por el usuario posterior. El middleware ahora inicia sesión al usuario en caso de falla en la autenticación.

Los textos traducidos son:

En versiones antiguas de Django era posible revelar cualquier campo de datos modificando los parámetros «popup» y «to_field» de la cadena de consulta en una página de formulario de cambio administrativo. Por ejemplo, solicitando una URL como /admin/auth/user/?_popup=1&t=password y visualizando el código HTML de la página permitía ver el hash de contraseña de cada usuario. Si bien el panel requiere que los usuarios tengan permisos para ver las páginas de formulario de cambio en primer lugar, esto podría hacer que se revelaran datos si confías en que los usuarios tienen acceso a ver solo ciertos campos en un modelo.

Para abordar el problema, se levantará una excepción si se especifica un valor to_field que no es un campo relacionado con un modelo registrado en el panel administrativo.

Bugfixes

  • Se corrigió la validación de correos electrónicos y URLs para rechazar una diéresis (#22579).

  • Se han evitado los índices virtuales en PostgreSQL sobre campos (#22514).

  • Se ha evitado un caso de borde donde los valores de los campos FK se podían inicializar con un valor incorrecto cuando se creaba un formulario inline para una relación definida que apuntara a un campo distinto del PK (#13794).

  • Se han restaurado las señales pre_delete para la eliminación en cascada de GenericRelation (#22998).

  • Se ha corregido el manejo de transacciones cuando se especifica una base de datos no por defecto en createcachetable y flush (#23089).

  • Se han corregido los errores «ORA-01843: no es un mes válido» al utilizar Unicode con versiones antiguas del servidor Oracle (#20292).

  • Se ha restaurado la corrección de fallos para enviar correo electrónico en Unicode con Python 2.6.5 y versiones inferiores (#19107).

  • Se han evitado los errores UnicodeDecodeError en runserver con locales no UTF-8 y no inglesas (#23265).

  • Se han corregido los errores JavaScript al editar objetos de geometría múltiple en el widget OpenLayers (#23137, #23293).

  • Se ha evitado una caída en Python 3 con cadenas de consulta que contienen caracteres no ASCII no codificados (#22996).