{"title":"Django 4.2.28 release notes","version":"dev","locale":"en","docname":"releases/4.2.28","url":"/en/dev/releases/4.2.28/","canonical":"https://djangodocs.dev/en/dev/releases/4.2.28/","summary":"Django 4.2.28 fixes three security issues with severity “high”, two security issues with severity “moderate”, and one security issue with severity “low” in…","html":"<h1>Django 4.2.28 release notes<a class=\"heading-anchor\" href=\"#django-4-2-28-release-notes\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h1>\n<p><em>February 3, 2026</em></p>\n<p>Django 4.2.28 fixes three security issues with severity “high”, two security\nissues with severity “moderate”, and one security issue with severity “low” in\n4.2.27.</p>\n<section id=\"cve-2025-13473-username-enumeration-through-timing-difference-in-mod-wsgi-authentication-handler\">\n<h2>CVE-2025-13473: Username enumeration through timing difference in mod_wsgi authentication handler<a class=\"heading-anchor\" href=\"#cve-2025-13473-username-enumeration-through-timing-difference-in-mod-wsgi-authentication-handler\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>The <code class=\"docutils literal notranslate\">django.contrib.auth.handlers.modwsgi.check_password()</code> function for\n<a class=\"reference internal\" href=\"/en/dev/howto/deployment/wsgi/apache-auth/\"><span class=\"doc\">authentication via mod_wsgi</span></a>\nallowed remote attackers to enumerate users via a timing attack.</p>\n<p>This issue has severity “low” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"cve-2025-14550-potential-denial-of-service-vulnerability-via-repeated-headers-when-using-asgi\">\n<h2>CVE-2025-14550: Potential denial-of-service vulnerability via repeated headers when using ASGI<a class=\"heading-anchor\" href=\"#cve-2025-14550-potential-denial-of-service-vulnerability-via-repeated-headers-when-using-asgi\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>When receiving duplicates of a single header, <code class=\"docutils literal notranslate\">ASGIRequest</code> allowed a remote\nattacker to cause a potential denial-of-service via a specifically created\nrequest with multiple duplicate headers. The vulnerability resulted from\nrepeated string concatenation while combining repeated headers, which\nproduced super-linear computation resulting in service degradation or outage.</p>\n<p>This issue has severity “moderate” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security\npolicy</span></a>.</p>\n</section>\n<section id=\"cve-2026-1207-potential-sql-injection-via-raster-lookups-on-postgis\">\n<h2>CVE-2026-1207: Potential SQL injection via raster lookups on PostGIS<a class=\"heading-anchor\" href=\"#cve-2026-1207-potential-sql-injection-via-raster-lookups-on-postgis\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/en/dev/ref/contrib/gis/db-api/#spatial-lookup-raster\"><span class=\"std std-ref\">Raster lookups</span></a> on GIS fields (only implemented\non PostGIS) were subject to SQL injection if untrusted data was used as a band\nindex.</p>\n<p>As a reminder, all untrusted user input should be validated before use.</p>\n<p>This issue has severity “high” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"cve-2026-1285-potential-denial-of-service-vulnerability-in-django-utils-text-truncator-html-methods\">\n<h2>CVE-2026-1285: Potential denial-of-service vulnerability in <code class=\"docutils literal notranslate\">django.utils.text.Truncator</code> HTML methods<a class=\"heading-anchor\" href=\"#cve-2026-1285-potential-denial-of-service-vulnerability-in-django-utils-text-truncator-html-methods\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><code class=\"docutils literal notranslate\">django.utils.text.Truncator.chars()</code> and <code class=\"docutils literal notranslate\">Truncator.words()</code> methods (with\n<code class=\"docutils literal notranslate\">html=True</code>) and the <a class=\"reference internal\" href=\"/en/dev/ref/templates/builtins/#std-templatefilter-truncatechars_html\"><code class=\"xref std std-tfilter docutils literal notranslate\">truncatechars_html</code></a> and\n<a class=\"reference internal\" href=\"/en/dev/ref/templates/builtins/#std-templatefilter-truncatewords_html\"><code class=\"xref std std-tfilter docutils literal notranslate\">truncatewords_html</code></a> template filters were subject to a potential\ndenial-of-service attack via certain inputs with a large number of unmatched\nHTML end tags, which could cause quadratic time complexity during HTML parsing.</p>\n<p>This issue has severity “moderate” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security\npolicy</span></a>.</p>\n</section>\n<section id=\"cve-2026-1287-potential-sql-injection-in-column-aliases-via-control-characters\">\n<h2>CVE-2026-1287: Potential SQL injection in column aliases via control characters<a class=\"heading-anchor\" href=\"#cve-2026-1287-potential-sql-injection-in-column-aliases-via-control-characters\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.FilteredRelation\" title=\"django.db.models.FilteredRelation\"><code class=\"xref py py-class docutils literal notranslate\">FilteredRelation</code></a> was subject to SQL injection in column aliases via\ncontrol characters, using a suitably crafted dictionary, with dictionary\nexpansion, as the <code class=\"docutils literal notranslate\">**kwargs</code> passed to <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.annotate\" title=\"django.db.models.query.QuerySet.annotate\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.annotate()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.aggregate\" title=\"django.db.models.query.QuerySet.aggregate\"><code class=\"xref py py-meth docutils literal notranslate\">aggregate()</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra\" title=\"django.db.models.query.QuerySet.extra\"><code class=\"xref py py-meth docutils literal notranslate\">extra()</code></a>,\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values\" title=\"django.db.models.query.QuerySet.values\"><code class=\"xref py py-meth docutils literal notranslate\">values()</code></a>, <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list\" title=\"django.db.models.query.QuerySet.values_list\"><code class=\"xref py py-meth docutils literal notranslate\">values_list()</code></a>, and\n<a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.alias\" title=\"django.db.models.query.QuerySet.alias\"><code class=\"xref py py-meth docutils literal notranslate\">alias()</code></a>.</p>\n<p>This issue has severity “high” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>\n<section id=\"cve-2026-1312-potential-sql-injection-via-queryset-order-by-and-filteredrelation\">\n<h2>CVE-2026-1312: Potential SQL injection via <code class=\"docutils literal notranslate\">QuerySet.order_by</code> and <code class=\"docutils literal notranslate\">FilteredRelation</code><a class=\"heading-anchor\" href=\"#cve-2026-1312-potential-sql-injection-via-queryset-order-by-and-filteredrelation\"><span class=\"visually-hidden\">Link to this heading</span><span aria-hidden=\"true\">#</span></a></h2>\n<p><a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.order_by\" title=\"django.db.models.query.QuerySet.order_by\"><code class=\"xref py py-meth docutils literal notranslate\">QuerySet.order_by()</code></a> was subject to SQL injection in column aliases\ncontaining periods when the same alias was, using a suitably crafted\ndictionary, with dictionary expansion, used in <a class=\"reference internal\" href=\"/en/dev/ref/models/querysets/#django.db.models.FilteredRelation\" title=\"django.db.models.FilteredRelation\"><code class=\"xref py py-class docutils literal notranslate\">FilteredRelation</code></a>.</p>\n<p>This issue has severity “high” according to the <a class=\"reference internal\" href=\"/en/dev/internals/security/#severity-levels\"><span class=\"std std-ref\">Django security policy</span></a>.</p>\n</section>","rootId":"django-4-2-28-release-notes","toc":[{"title":"CVE-2025-13473: Username enumeration through timing difference in mod_wsgi authentication handler","anchor":"cve-2025-13473-username-enumeration-through-timing-difference-in-mod-wsgi-authentication-handler","children":[]},{"title":"CVE-2025-14550: Potential denial-of-service vulnerability via repeated headers when using ASGI","anchor":"cve-2025-14550-potential-denial-of-service-vulnerability-via-repeated-headers-when-using-asgi","children":[]},{"title":"CVE-2026-1207: Potential SQL injection via raster lookups on PostGIS","anchor":"cve-2026-1207-potential-sql-injection-via-raster-lookups-on-postgis","children":[]},{"title":"CVE-2026-1285: Potential denial-of-service vulnerability in django.utils.text.Truncator HTML methods","anchor":"cve-2026-1285-potential-denial-of-service-vulnerability-in-django-utils-text-truncator-html-methods","children":[]},{"title":"CVE-2026-1287: Potential SQL injection in column aliases via control characters","anchor":"cve-2026-1287-potential-sql-injection-in-column-aliases-via-control-characters","children":[]},{"title":"CVE-2026-1312: Potential SQL injection via QuerySet.order_by and FilteredRelation","anchor":"cve-2026-1312-potential-sql-injection-via-queryset-order-by-and-filteredrelation","children":[]}],"breadcrumbs":[{"docname":"releases/index","title":"Release notes","url":"/en/dev/releases/"}],"prev":{"docname":"releases/4.2.29","title":"Django 4.2.29 release notes","url":"/en/dev/releases/4.2.29/"},"next":{"docname":"releases/4.2.27","title":"Django 4.2.27 release notes","url":"/en/dev/releases/4.2.27/"},"formats":{"html":"/en/dev/releases/4.2.28/","markdown":"/en/dev/releases/4.2.28.md","json":"/en/dev/releases/4.2.28.json"},"source":"https://github.com/django/django/blob/main/docs/releases/4.2.28.txt","official":"https://docs.djangoproject.com/en/dev/releases/4.2.28/","inVersions":["dev","6.1","6.0","5.2","4.2"],"inLocales":["en"]}