diff --git a/django/urls/resolvers.py b/django/urls/resolvers.py index f8e608c7c2..490e2b2ff2 100644 --- a/django/urls/resolvers.py +++ b/django/urls/resolvers.py @@ -303,7 +303,7 @@ class LocalePrefixPattern: @property def regex(self): # This is only used by reverse() and cached in _reverse_dict. - return re.compile(self.language_prefix) + return re.compile(re.escape(self.language_prefix)) @property def language_prefix(self): diff --git a/docs/releases/3.2.16.txt b/docs/releases/3.2.16.txt index 3769d0837c..da0a6c4ed4 100644 --- a/docs/releases/3.2.16.txt +++ b/docs/releases/3.2.16.txt @@ -6,4 +6,8 @@ Django 3.2.16 release notes Django 3.2.16 fixes a security issue with severity "medium" in 3.2.15. -... +CVE-2022-41323: Potential denial-of-service vulnerability in internationalized URLs +=================================================================================== + +Internationalized URLs were subject to potential denial of service attack via +the locale parameter. diff --git a/tests/i18n/patterns/tests.py b/tests/i18n/patterns/tests.py index 96e9453e9e..3b0ece9d89 100644 --- a/tests/i18n/patterns/tests.py +++ b/tests/i18n/patterns/tests.py @@ -172,6 +172,12 @@ class URLTranslationTests(URLTestCaseBase): self.assertEqual(translate_url('/nl/gebruikers/', 'en'), '/en/users/') self.assertEqual(translation.get_language(), 'nl') + def test_locale_not_interepreted_as_regex(self): + with translation.override("e("): + # Would previously error: + # re.error: missing ), unterminated subpattern at position 1 + reverse("users") + class URLNamespaceTests(URLTestCaseBase): """