summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorMariusz Felisiak <felisiak.mariusz@gmail.com>2023-04-13 10:10:56 +0200
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2023-05-03 13:43:16 +0200
commit21b1b1fc03e5f9e9f8c977ee6e35618dd3b353dd (patch)
tree0fc243d8c7e71dae06ace8c746fc88d24d52fed3 /django
parent290fd5ecece400490ad6bb557720d3b76f647eaf (diff)
[4.2.x] Fixed CVE-2023-31047, Fixed #31710 -- Prevented potential bypass of validation when uploading multiple files using one form field.
Thanks Moataz Al-Sharida and nawaik for reports. Co-authored-by: Shai Berger <shai@platonix.com> Co-authored-by: nessita <124304+nessita@users.noreply.github.com>
Diffstat (limited to 'django')
-rw-r--r--django/forms/widgets.py26
1 files changed, 25 insertions, 1 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py
index 9dd30095aa..3cc6fcb00c 100644
--- a/django/forms/widgets.py
+++ b/django/forms/widgets.py
@@ -413,17 +413,41 @@ class MultipleHiddenInput(HiddenInput):
class FileInput(Input):
+ allow_multiple_selected = False
input_type = "file"
needs_multipart_form = True
template_name = "django/forms/widgets/file.html"
+ def __init__(self, attrs=None):
+ if (
+ attrs is not None
+ and not self.allow_multiple_selected
+ and attrs.get("multiple", False)
+ ):
+ raise ValueError(
+ "%s doesn't support uploading multiple files."
+ % self.__class__.__qualname__
+ )
+ if self.allow_multiple_selected:
+ if attrs is None:
+ attrs = {"multiple": True}
+ else:
+ attrs.setdefault("multiple", True)
+ super().__init__(attrs)
+
def format_value(self, value):
"""File input never renders a value."""
return
def value_from_datadict(self, data, files, name):
"File widgets take data from FILES, not POST"
- return files.get(name)
+ getter = files.get
+ if self.allow_multiple_selected:
+ try:
+ getter = files.getlist
+ except AttributeError:
+ pass
+ return getter(name)
def value_omitted_from_data(self, data, files, name):
return name not in files