summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorJake Howard <git@theorangeone.net>2026-01-14 15:25:45 +0000
committerJacob Walls <jacobtylerwalls@gmail.com>2026-02-03 08:00:14 -0500
commit972dbdd4f7f69e9c405e6fe12a1b90e4713c1611 (patch)
tree052d5bf91f17028daeca71c77f35f0ddf0c8f42f /django
parentd72cc3be3be0bbebdcaea5a8c8106b4d6f2a32bd (diff)
[6.0.x] Fixed CVE-2025-14550 -- Optimized repeated header parsing in ASGI requests.
Thanks Jiyong Yang for the report, and Natalia Bidart, Jacob Walls, and Shai Berger for reviews. Backport of eb22e1d6d643360e952609ef562c139a100ea4eb from main.
Diffstat (limited to 'django')
-rw-r--r--django/core/handlers/asgi.py11
1 files changed, 6 insertions, 5 deletions
diff --git a/django/core/handlers/asgi.py b/django/core/handlers/asgi.py
index b4056ca042..1ca9130a78 100644
--- a/django/core/handlers/asgi.py
+++ b/django/core/handlers/asgi.py
@@ -3,6 +3,7 @@ import logging
import sys
import tempfile
import traceback
+from collections import defaultdict
from contextlib import aclosing
from asgiref.sync import ThreadSensitiveContext, sync_to_async
@@ -83,6 +84,7 @@ class ASGIRequest(HttpRequest):
self.META["SERVER_NAME"] = "unknown"
self.META["SERVER_PORT"] = "0"
# Headers go into META.
+ _headers = defaultdict(list)
for name, value in self.scope.get("headers", []):
name = name.decode("latin1")
if name == "content-length":
@@ -96,11 +98,10 @@ class ASGIRequest(HttpRequest):
value = value.decode("latin1")
if corrected_name == "HTTP_COOKIE":
value = value.rstrip("; ")
- if "HTTP_COOKIE" in self.META:
- value = self.META[corrected_name] + "; " + value
- elif corrected_name in self.META:
- value = self.META[corrected_name] + "," + value
- self.META[corrected_name] = value
+ _headers[corrected_name].append(value)
+ if cookie_header := _headers.pop("HTTP_COOKIE", None):
+ self.META["HTTP_COOKIE"] = "; ".join(cookie_header)
+ self.META.update({name: ",".join(value) for name, value in _headers.items()})
# Pull out request encoding, if provided.
self._set_content_type_params(self.META)
# Directly assign the body file to be our stream.