From 9f6d50d02ea7ce1c5c2adf1c7819700a7912e0d7 Mon Sep 17 00:00:00 2001 From: Carl Meyer Date: Wed, 9 Feb 2011 02:41:32 +0000 Subject: [PATCH] Fixed #15182 - Fixed a security issue with ClearableFileInput. Disclosure and new release forthcoming. git-svn-id: http://code.djangoproject.com/svn/django/trunk@15470 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/forms/widgets.py | 7 ++++--- tests/regressiontests/forms/tests/widgets.py | 22 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/django/forms/widgets.py b/django/forms/widgets.py index aa309a17a1..dd5868f479 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -330,12 +330,13 @@ class ClearableFileInput(FileInput): if value and hasattr(value, "url"): template = self.template_with_initial substitutions['initial'] = (u'%s' - % (value.url, value)) + % (escape(value.url), + escape(force_unicode(value)))) if not self.is_required: checkbox_name = self.clear_checkbox_name(name) checkbox_id = self.clear_checkbox_id(checkbox_name) - substitutions['clear_checkbox_name'] = checkbox_name - substitutions['clear_checkbox_id'] = checkbox_id + substitutions['clear_checkbox_name'] = conditional_escape(checkbox_name) + substitutions['clear_checkbox_id'] = conditional_escape(checkbox_id) substitutions['clear'] = CheckboxInput().render(checkbox_name, False, attrs={'id': checkbox_id}) substitutions['clear_template'] = self.template_with_clear % substitutions diff --git a/tests/regressiontests/forms/tests/widgets.py b/tests/regressiontests/forms/tests/widgets.py index 7d2b633778..4c5aeb0147 100644 --- a/tests/regressiontests/forms/tests/widgets.py +++ b/tests/regressiontests/forms/tests/widgets.py @@ -1086,6 +1086,28 @@ class ClearableFileInputTests(TestCase): self.assertEqual(widget.render('myfile', FakeFieldFile()), u'Currently: something
Change: ') + def test_html_escaped(self): + """ + A ClearableFileInput should escape name, filename and URL when + rendering HTML. Refs #15182. + """ + + class StrangeFieldFile(object): + url = "something?chapter=1§=2©=3&lang=en" + + def __unicode__(self): + return u'''something
.jpg''' + + widget = ClearableFileInput() + field = StrangeFieldFile() + output = widget.render('my
file', field) + self.assertFalse(field.url in output) + self.assertTrue(u'href="something?chapter=1&sect=2&copy=3&lang=en"' in output) + self.assertFalse(unicode(field) in output) + self.assertTrue(u'something<div onclick="alert('oops')">.jpg' in output) + self.assertTrue(u'my<div>file' in output) + self.assertFalse(u'my
file' in output) + def test_clear_input_renders_only_if_not_required(self): """ A ClearableFileInput with is_required=False does not render a clear