VYPR
Moderate severityNVD Advisory· Published Oct 4, 2013· Updated Apr 29, 2026

CVE-2013-4249

CVE-2013-4249

Description

Cross-site scripting (XSS) vulnerability in the AdminURLFieldWidget widget in contrib/admin/widgets.py in Django 1.5.x before 1.5.2 and 1.6.x before 1.6 beta 2 allows remote attackers to inject arbitrary web script or HTML via a URLField.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
djangoPyPI
>= 1.5, < 1.5.21.5.2

Affected products

5
  • cpe:2.3:a:djangoproject:django:1.5:*:*:*:*:*:*:*+ 4 more
    • cpe:2.3:a:djangoproject:django:1.5:*:*:*:*:*:*:*
    • cpe:2.3:a:djangoproject:django:1.5:alpha:*:*:*:*:*:*
    • cpe:2.3:a:djangoproject:django:1.5:beta:*:*:*:*:*:*
    • cpe:2.3:a:djangoproject:django:1.5.1:*:*:*:*:*:*:*
    • cpe:2.3:a:djangoproject:django:1.6:beta1:*:*:*:*:*:*

Patches

2
cbe6d5568f4f

Apply autoescaping to AdminURLFieldWidget.

https://github.com/django/djangoJacob Kaplan-MossAug 13, 2013via ghsa
2 files changed · +15 9
  • django/contrib/admin/widgets.py+2 2 modified
    @@ -305,9 +305,9 @@ def render(self, name, value, attrs=None):
             html = super(AdminURLFieldWidget, self).render(name, value, attrs)
             if value:
                 value = force_text(self._format_value(value))
    -            final_attrs = {'href': mark_safe(smart_urlquote(value))}
    +            final_attrs = {'href': smart_urlquote(value)}
                 html = format_html(
    -                '<p class="url">{0} <a {1}>{2}</a><br />{3} {4}</p>',
    +                '<p class="url">{0} <a{1}>{2}</a><br />{3} {4}</p>',
                     _('Currently:'), flatatt(final_attrs), value,
                     _('Change:'), html
                 )
    
  • tests/admin_widgets/tests.py+13 7 modified
    @@ -321,18 +321,24 @@ def test_render_idn(self):
             w = widgets.AdminURLFieldWidget()
             self.assertHTMLEqual(
                 conditional_escape(w.render('test', 'http://example-äüö.com')),
    -            '<p class="url">Currently:<a href="http://xn--example--7za4pnc.com">http://example-äüö.com</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example-äüö.com" /></p>'
    +            '<p class="url">Currently: <a href="http://xn--example--7za4pnc.com">http://example-äüö.com</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example-äüö.com" /></p>'
             )
     
         def test_render_quoting(self):
    +        # WARNING: Don't use assertHTMLEqual in that testcase!
    +        # assertHTMLEqual will get rid of some escapes which are tested here!
             w = widgets.AdminURLFieldWidget()
    -        self.assertHTMLEqual(
    -            conditional_escape(w.render('test', 'http://example.com/<sometag>some text</sometag>')),
    -            '<p class="url">Currently:<a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example.com/<sometag>some text</sometag>" /></p>'
    +        self.assertEqual(
    +            w.render('test', 'http://example.com/<sometag>some text</sometag>'),
    +            '<p class="url">Currently: <a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change: <input class="vURLField" name="test" type="url" value="http://example.com/&lt;sometag&gt;some text&lt;/sometag&gt;" /></p>'
             )
    -        self.assertHTMLEqual(
    -            conditional_escape(w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>')),
    -            '<p class="url">Currently:<a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example-äüö.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change:<input class="vURLField" name="test" type="url" value="http://example-äüö.com/<sometag>some text</sometag>" /></p>'
    +        self.assertEqual(
    +            w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>'),
    +            '<p class="url">Currently: <a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example-äüö.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change: <input class="vURLField" name="test" type="url" value="http://example-äüö.com/&lt;sometag&gt;some text&lt;/sometag&gt;" /></p>'
    +        )
    +        self.assertEqual(
    +            w.render('test', 'http://www.example.com/%C3%A4"><script>alert("XSS!")</script>"'),
    +            '<p class="url">Currently: <a href="http://www.example.com/%C3%A4%22%3E%3Cscript%3Ealert(%22XSS!%22)%3C/script%3E%22">http://www.example.com/%C3%A4&quot;&gt;&lt;script&gt;alert(&quot;XSS!&quot;)&lt;/script&gt;&quot;</a><br />Change: <input class="vURLField" name="test" type="url" value="http://www.example.com/%C3%A4&quot;&gt;&lt;script&gt;alert(&quot;XSS!&quot;)&lt;/script&gt;&quot;" /></p>'
             )
     
     
    
90363e388c61

Apply autoescaping to AdminURLFieldWidget.

https://github.com/django/djangoJacob Kaplan-MossAug 13, 2013via ghsa
2 files changed · +15 9
  • django/contrib/admin/widgets.py+2 2 modified
    @@ -310,9 +310,9 @@ def render(self, name, value, attrs=None):
             html = super(AdminURLFieldWidget, self).render(name, value, attrs)
             if value:
                 value = force_text(self._format_value(value))
    -            final_attrs = {'href': mark_safe(smart_urlquote(value))}
    +            final_attrs = {'href': smart_urlquote(value)}
                 html = format_html(
    -                '<p class="url">{0} <a {1}>{2}</a><br />{3} {4}</p>',
    +                '<p class="url">{0} <a{1}>{2}</a><br />{3} {4}</p>',
                     _('Currently:'), flatatt(final_attrs), value,
                     _('Change:'), html
                 )
    
  • tests/regressiontests/admin_widgets/tests.py+13 7 modified
    @@ -299,18 +299,24 @@ def test_render_idn(self):
             w = widgets.AdminURLFieldWidget()
             self.assertHTMLEqual(
                 conditional_escape(w.render('test', 'http://example-äüö.com')),
    -            '<p class="url">Currently:<a href="http://xn--example--7za4pnc.com">http://example-äüö.com</a><br />Change:<input class="vURLField" name="test" type="text" value="http://example-äüö.com" /></p>'
    +            '<p class="url">Currently: <a href="http://xn--example--7za4pnc.com">http://example-äüö.com</a><br />Change:<input class="vURLField" name="test" type="text" value="http://example-äüö.com" /></p>'
             )
     
         def test_render_quoting(self):
    +        # WARNING: Don't use assertHTMLEqual in that testcase!
    +        # assertHTMLEqual will get rid of some escapes which are tested here!
             w = widgets.AdminURLFieldWidget()
    -        self.assertHTMLEqual(
    -            conditional_escape(w.render('test', 'http://example.com/<sometag>some text</sometag>')),
    -            '<p class="url">Currently:<a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change:<input class="vURLField" name="test" type="text" value="http://example.com/<sometag>some text</sometag>" /></p>'
    +        self.assertEqual(
    +            w.render('test', 'http://example.com/<sometag>some text</sometag>'),
    +            '<p class="url">Currently: <a href="http://example.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change: <input class="vURLField" name="test" type="text" value="http://example.com/&lt;sometag&gt;some text&lt;/sometag&gt;" /></p>'
             )
    -        self.assertHTMLEqual(
    -            conditional_escape(w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>')),
    -            '<p class="url">Currently:<a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example-äüö.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change:<input class="vURLField" name="test" type="text" value="http://example-äüö.com/<sometag>some text</sometag>" /></p>'
    +        self.assertEqual(
    +            w.render('test', 'http://example-äüö.com/<sometag>some text</sometag>'),
    +            '<p class="url">Currently: <a href="http://xn--example--7za4pnc.com/%3Csometag%3Esome%20text%3C/sometag%3E">http://example-äüö.com/&lt;sometag&gt;some text&lt;/sometag&gt;</a><br />Change: <input class="vURLField" name="test" type="text" value="http://example-äüö.com/&lt;sometag&gt;some text&lt;/sometag&gt;" /></p>'
    +        )
    +        self.assertEqual(
    +            w.render('test', 'http://www.example.com/%C3%A4"><script>alert("XSS!")</script>"'),
    +            '<p class="url">Currently: <a href="http://www.example.com/%C3%A4%22%3E%3Cscript%3Ealert(%22XSS!%22)%3C/script%3E%22">http://www.example.com/%C3%A4&quot;&gt;&lt;script&gt;alert(&quot;XSS!&quot;)&lt;/script&gt;&quot;</a><br />Change: <input class="vURLField" name="test" type="text" value="http://www.example.com/%C3%A4&quot;&gt;&lt;script&gt;alert(&quot;XSS!&quot;)&lt;/script&gt;&quot;" /></p>'
             )
     
     
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

12

News mentions

0

No linked articles in our index yet.