Notas de lanzamiento de Django 1.8.3

8 de julio de 2015

Django 1.8.3 corrige varias cuestiones de seguridad y errores en la versión 1.8.2.

Además, django.utils.deprecation.RemovedInDjango20Warning se ha renombrado a RemovedInDjango110Warning ya que el plan de versiones se revisó para 1.9, 1.10, 1.11 (LTS), 2.0 (que deja de soportar Python 2). Para compatibilidad hacia atrás, RemovedInDjango20Warning sigue siendo un alias importable.

Posibilidad de denegación de servicio al llenar el almacenamiento de sesión

En versiones anteriores de Django, los backends de sesión creados un nuevo registro vacío en el almacenamiento de sesión cada vez que se accedía a request.session y había una clave de sesión proporcionada en las cookies del request que no tenía ya un registro de sesión. Esto podría permitir a un atacante crear fácilmente muchos nuevos registros de sesión simplemente enviando solicitudes repetidas con claves de sesión desconocidas, lo que potencialmente llenaría el almacenamiento de sesiones o causaría la expulsión de los registros de sesión de otros usuarios.

Los backends de sesión integrados ahora crean un registro de sesión solo si la sesión se modifica realmente; no se crean registros de sesión vacíos. Por lo tanto, esta posible DoS es ahora posible únicamente si el sitio expone una vista que modifica la sesión a usuarios anónimos.

Como cada backend de sesión integrado se corrigió por separado (en lugar de una corrección en el marco de sesiones centralizado), los mantenedores de backends de sesión terceros deben comprobar si la misma vulnerabilidad está presente en su backend y corregirla si es así.

Posibilidad de inyección de encabezados desde que los validadores aceptan saltos de línea en la entrada

Algunos de los validadores integrados de Django (EmailValidator, entre otros) no prohibían caracteres de nueva línea (debido al uso de $ en lugar de \Z en las expresiones regulares). Si utilizas valores con nuevas líneas en respuestas HTTP o encabezados de correo electrónico, puedes sufrir ataques de inyección de encabezados. Django no es vulnerable porque HttpResponse y las utilidades para enviar correos electrónicos en django.core.mail prohíben nuevas líneas en los encabezados HTTP y SMTP, respectivamente. Aunque los validadores han sido corregidos en Django, si estás creando respuestas HTTP o mensajes de correo electrónico de otras maneras, es una buena idea asegurarte de que esas funciones también prohíban nuevas líneas. También podrías querer validar que cualquier dato existente en tu aplicación no contenga nuevas líneas inesperadas.

validate_ipv4_address(), validate_slug() y URLValidator también están afectados, sin embargo, a partir de Django 1.6 los campos de formulario GenericIPAddresseField, IPAddressField, SlugField y URLField que utilizan estos validadores eliminan el input, por lo que la posibilidad de que se introduzcan saltos de línea en tus datos solo existe si estás utilizando estos validadores fuera de los campos de formulario.

La función no documentada e internamente inutilizada validate_integer() ahora es más estricta ya que valida utilizando una expresión regular en lugar de simplemente convertir el valor usando int() y comprobar si se levantó una excepción.

Posibilidad de denegación de servicio en la validación de URL

La clase URLValidator incluía una expresión regular que era extremadamente lenta para evaluar contra ciertos inputs inválidos. Esta expresión regular se ha simplificado y optimizado.

Bugfixes

  • Se ha corregido BaseRangeField.prepare_value() para utilizar el método prepare_value() de cada campo base_field (#24841).

  • Se ha corregido la caída durante makemigrations si un módulo de migraciones carece de __init__.py o es un archivo (#24848).

  • Se ha corregido que QuerySet.exists() devolviera resultados incorrectos después de la annotación con Count() (#24835).

  • Se ha corregido HStoreField.has_changed() (#24844).

  • Revertido una optimización al procesador de contexto del CSRF que causó una regresión (#24836).

  • Se ha corregido una regresión que causaba que los procesadores de contexto de plantillas sobreescribieran variables establecidas en un RequestContext después de su creación (#24847).

  • Se ha evitado la pérdida de las propiedades null/not null de las columnas durante el renombramiento de campos de bases de datos MySQL (#24817).

  • Se ha corregido el crash cuando se utiliza una relación uno a uno inversa en ModelAdmin.list_display (#24851).

  • Se ha corregido la citación SQL al renombrar un campo a AutoField en PostgreSQL (#24892).

  • Se ha corregido la falta de constraint único cuando se cambia un campo de primary_key=True a unique=True (#24893).

  • Se ha corregido el pickling de consultas cuando se utiliza prefetch_related() después de eliminar objetos (#24831).

  • Se permite utilizar choices más largos que 1 día con DurationField (#24897).

  • Se ha corregido el crash al cargar migraciones compactadas desde dos aplicaciones con una dependencia entre ellas, donde las migraciones reemplazadas de la aplicación dependiente están parcialmente aplicadas (#24895).

  • Se ha corregido el registro del estado aplicado para migraciones compactadas (reemplazo) (#24628).

  • Se ha corregido las anotaciones de consultas cuando se utiliza Case expresiones con exclude() (#24833).

  • Corrección de la promoción de unión para múltiples expresiones Case. Anotando una consulta con múltiples expresiones Case podría filtrar resultados inesperadamente (#24924).

  • Se ha corregido el uso de transformaciones en consultas subidas (#24744).

  • Se ha corregido SimpleTestCase.assertRaisesMessage() en Python 2.7.10 (#24903).

  • Se proporcionó una mejor compatibilidad hacia atrás para el argumento verbosity en comandos de gestión optparse convirtiéndolo a un entero (#24769).

  • Corregido prefetch_related() en bases de datos distintas a PostgreSQL para modelos que utilizan claves primarias UUID (#24912).

  • Eliminado las restricciones de unique_together en MySQL (#24972).

  • Se ha corregido el fallo que ocurría al subir imágenes con tipos de MIME que no detecta Pillow, como por ejemplo bitmap, en forms.ImageField (#24948).

  • Corregida una regresión al eliminar un modelo a través de la interfaz administrativa que tiene una GenericRelation con un related_query_name (#24940).

  • Permitió valores no ASCII para ForeignKey.related_name en Python 3, corrigiendo el sistema de comprobación falso positivo (#25016).

  • Formularios en línea fijos que utilizan un objeto padre con una clave primaria UUIDField y un objeto hijo con una clave primaria AutoField (#24958).

  • Se corrigió una regresión en el filtro de plantilla unordered_list para ciertos entradas (#25031).

  • Se ha corregido una regresión en URLValidator que invalidaba TLDs Punycode (#25059).

  • Mejoró la pyinotify runserver polling (#23882).