mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed CVE-2019-12308 -- Made AdminURLFieldWidget validate URL before rendering clickable link.
This commit is contained in:
@@ -333,6 +333,13 @@ class AdminSplitDateTimeWidgetTest(SimpleTestCase):
|
||||
|
||||
|
||||
class AdminURLWidgetTest(SimpleTestCase):
|
||||
def test_get_context_validates_url(self):
|
||||
w = widgets.AdminURLFieldWidget()
|
||||
for invalid in ['', '/not/a/full/url/', 'javascript:alert("Danger XSS!")']:
|
||||
with self.subTest(url=invalid):
|
||||
self.assertFalse(w.get_context('name', invalid, {})['url_valid'])
|
||||
self.assertTrue(w.get_context('name', 'http://example.com', {})['url_valid'])
|
||||
|
||||
def test_render(self):
|
||||
w = widgets.AdminURLFieldWidget()
|
||||
self.assertHTMLEqual(
|
||||
@@ -366,31 +373,31 @@ class AdminURLWidgetTest(SimpleTestCase):
|
||||
VALUE_RE = re.compile('value="([^"]+)"')
|
||||
TEXT_RE = re.compile('<a[^>]+>([^>]+)</a>')
|
||||
w = widgets.AdminURLFieldWidget()
|
||||
output = w.render('test', 'http://example.com/<sometag>some text</sometag>')
|
||||
output = w.render('test', 'http://example.com/<sometag>some-text</sometag>')
|
||||
self.assertEqual(
|
||||
HREF_RE.search(output).groups()[0],
|
||||
'http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E',
|
||||
'http://example.com/%3Csometag%3Esome-text%3C/sometag%3E',
|
||||
)
|
||||
self.assertEqual(
|
||||
TEXT_RE.search(output).groups()[0],
|
||||
'http://example.com/<sometag>some text</sometag>',
|
||||
'http://example.com/<sometag>some-text</sometag>',
|
||||
)
|
||||
self.assertEqual(
|
||||
VALUE_RE.search(output).groups()[0],
|
||||
'http://example.com/<sometag>some text</sometag>',
|
||||
'http://example.com/<sometag>some-text</sometag>',
|
||||
)
|
||||
output = w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>')
|
||||
output = w.render('test', 'http://example-äüö.com/<sometag>some-text</sometag>')
|
||||
self.assertEqual(
|
||||
HREF_RE.search(output).groups()[0],
|
||||
'http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E',
|
||||
'http://xn--example--7za4pnc.com/%3Csometag%3Esome-text%3C/sometag%3E',
|
||||
)
|
||||
self.assertEqual(
|
||||
TEXT_RE.search(output).groups()[0],
|
||||
'http://example-äüö.com/<sometag>some text</sometag>',
|
||||
'http://example-äüö.com/<sometag>some-text</sometag>',
|
||||
)
|
||||
self.assertEqual(
|
||||
VALUE_RE.search(output).groups()[0],
|
||||
'http://example-äüö.com/<sometag>some text</sometag>',
|
||||
'http://example-äüö.com/<sometag>some-text</sometag>',
|
||||
)
|
||||
output = w.render('test', 'http://www.example.com/%C3%A4"><script>alert("XSS!")</script>"')
|
||||
self.assertEqual(
|
||||
|
||||
Reference in New Issue
Block a user