Loading django/utils/html.py +4 −2 Original line number Diff line number Diff line Loading @@ -156,8 +156,10 @@ def strip_tags(value): if not ('<' in value or '>' in value): return value new_value = _strip_once(value) if new_value == value: # _strip_once was not able to detect more tags if len(new_value) >= len(value): # _strip_once was not able to detect more tags or length increased # due to http://bugs.python.org/issue20288 # (affects Python 2 < 2.7.7 and Python 3 < 3.3.5) return value else: value = new_value Loading docs/releases/1.6.11.txt +17 −0 Original line number Diff line number Diff line Loading @@ -5,3 +5,20 @@ Django 1.6.11 release notes *March 18, 2015* Django 1.6.11 fixes two security issues in 1.6.10. Denial-of-service possibility with ``strip_tags()`` =================================================== Last year :func:`~django.utils.html.strip_tags` was changed to work iteratively. The problem is that the size of the input it's processing can increase on each iteration which results in an infinite loop in ``strip_tags()``. This issue only affects versions of Python that haven't received `a bugfix in HTMLParser <http://bugs.python.org/issue20288>`_; namely Python < 2.7.7 and 3.3.5. Some operating system vendors have also backported the fix for the Python bug into their packages of earlier versions. To remedy this issue, ``strip_tags()`` will now return the original input if it detects the length of the string it's processing increases. Remember that absolutely NO guarantee is provided about the results of ``strip_tags()`` being HTML safe. So NEVER mark safe the result of a ``strip_tags()`` call without escaping it first, for example with :func:`~django.utils.html.escape`. tests/utils_tests/test_html.py +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,9 @@ class TestUtilsHtml(TestCase): ('a<p a >b</p>c', 'abc'), ('d<a:b c:d>e</p>f', 'def'), ('<strong>foo</strong><a href="http://example.com">bar</a>', 'foobar'), # caused infinite loop on Pythons not patched with # http://bugs.python.org/issue20288 ('&gotcha&#;<>', '&gotcha&#;<>'), ) for value, output in items: self.check_output(f, value, output) Loading Loading
django/utils/html.py +4 −2 Original line number Diff line number Diff line Loading @@ -156,8 +156,10 @@ def strip_tags(value): if not ('<' in value or '>' in value): return value new_value = _strip_once(value) if new_value == value: # _strip_once was not able to detect more tags if len(new_value) >= len(value): # _strip_once was not able to detect more tags or length increased # due to http://bugs.python.org/issue20288 # (affects Python 2 < 2.7.7 and Python 3 < 3.3.5) return value else: value = new_value Loading
docs/releases/1.6.11.txt +17 −0 Original line number Diff line number Diff line Loading @@ -5,3 +5,20 @@ Django 1.6.11 release notes *March 18, 2015* Django 1.6.11 fixes two security issues in 1.6.10. Denial-of-service possibility with ``strip_tags()`` =================================================== Last year :func:`~django.utils.html.strip_tags` was changed to work iteratively. The problem is that the size of the input it's processing can increase on each iteration which results in an infinite loop in ``strip_tags()``. This issue only affects versions of Python that haven't received `a bugfix in HTMLParser <http://bugs.python.org/issue20288>`_; namely Python < 2.7.7 and 3.3.5. Some operating system vendors have also backported the fix for the Python bug into their packages of earlier versions. To remedy this issue, ``strip_tags()`` will now return the original input if it detects the length of the string it's processing increases. Remember that absolutely NO guarantee is provided about the results of ``strip_tags()`` being HTML safe. So NEVER mark safe the result of a ``strip_tags()`` call without escaping it first, for example with :func:`~django.utils.html.escape`.
tests/utils_tests/test_html.py +3 −0 Original line number Diff line number Diff line Loading @@ -80,6 +80,9 @@ class TestUtilsHtml(TestCase): ('a<p a >b</p>c', 'abc'), ('d<a:b c:d>e</p>f', 'def'), ('<strong>foo</strong><a href="http://example.com">bar</a>', 'foobar'), # caused infinite loop on Pythons not patched with # http://bugs.python.org/issue20288 ('&gotcha&#;<>', '&gotcha&#;<>'), ) for value, output in items: self.check_output(f, value, output) Loading