Lax cookie parsing in http.cookies could be a security issue when combined

with non-standard cookie handling in some Web browsers.

Reported by Sergey Bobrov.
This commit is contained in:
Antoine Pitrou 2014-09-17 00:25:57 +02:00
commit 637e4544af
4 changed files with 16 additions and 1 deletions

View file

@ -431,6 +431,7 @@ class Morsel(dict):
_LegalCharsPatt = r"[\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]" _LegalCharsPatt = r"[\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=]"
_CookiePattern = re.compile(r""" _CookiePattern = re.compile(r"""
(?x) # This is a verbose pattern (?x) # This is a verbose pattern
\s* # Optional whitespace at start of cookie
(?P<key> # Start of group 'key' (?P<key> # Start of group 'key'
""" + _LegalCharsPatt + r"""+? # Any word of at least one letter """ + _LegalCharsPatt + r"""+? # Any word of at least one letter
) # End of group 'key' ) # End of group 'key'
@ -534,7 +535,7 @@ class BaseCookie(dict):
while 0 <= i < n: while 0 <= i < n:
# Start looking for a cookie # Start looking for a cookie
match = patt.search(str, i) match = patt.match(str, i)
if not match: if not match:
# No more cookies # No more cookies
break break

View file

@ -179,6 +179,15 @@ class CookieTests(unittest.TestCase):
</script> </script>
""") """)
def test_invalid_cookies(self):
# Accepting these could be a security issue
C = cookies.SimpleCookie()
for s in (']foo=x', '[foo=x', 'blah]foo=x', 'blah[foo=x'):
C.load(s)
self.assertEqual(dict(C), {})
self.assertEqual(C.output(), '')
class MorselTests(unittest.TestCase): class MorselTests(unittest.TestCase):
"""Tests for the Morsel object.""" """Tests for the Morsel object."""

View file

@ -140,6 +140,7 @@ Martin Bless
Pablo Bleyer Pablo Bleyer
Erik van Blokland Erik van Blokland
Eric Blossom Eric Blossom
Sergey Bobrov
Finn Bock Finn Bock
Paul Boddie Paul Boddie
Matthew Boedicker Matthew Boedicker

View file

@ -32,6 +32,10 @@ Core and Builtins
Library Library
------- -------
- Lax cookie parsing in http.cookies could be a security issue when combined
with non-standard cookie handling in some Web browsers. Reported by
Sergey Bobrov.
- Issue #22384: An exception in Tkinter callback no longer crashes the program - Issue #22384: An exception in Tkinter callback no longer crashes the program
when it is run with pythonw.exe. when it is run with pythonw.exe.