Remove length requirement from v1 XSRF tokens

This commit is contained in:
William Tisäter 2014-07-07 23:29:44 +02:00
parent 67655497b0
commit 22e8614fdd
2 changed files with 19 additions and 4 deletions

View File

@ -1954,6 +1954,20 @@ class XSRFTest(SimpleHandlerTestCase):
body=urllib_parse.urlencode(dict(_xsrf=self.xsrf_token)))
self.assertEqual(response.code, 403)
def test_xsrf_success_short_token(self):
with ExpectLog(gen_log, ".*XSRF cookie does not match POST"):
response = self.fetch(
"/", method="POST",
body=urllib_parse.urlencode(dict(_xsrf='deadbeef')))
self.assertEqual(response.code, 403)
def test_xsrf_success_non_hex_token(self):
with ExpectLog(gen_log, ".*XSRF cookie is not a hexadecimal"):
response = self.fetch(
"/", method="POST",
body=urllib_parse.urlencode(dict(_xsrf='xoxo')))
self.assertEqual(response.code, 400)
def test_xsrf_fail_cookie_no_body(self):
with ExpectLog(gen_log, ".*'_xsrf' argument missing"):
response = self.fetch(

View File

@ -1140,14 +1140,15 @@ class RequestHandler(object):
else:
# Treat unknown versions as not present instead of failing.
return None, None, None
elif len(cookie) == 32:
else:
version = 1
token = binascii.a2b_hex(utf8(cookie))
try:
token = binascii.a2b_hex(utf8(cookie))
except TypeError:
raise HTTPError(400, "XSRF cookie is not a hexadecimal")
# We don't have a usable timestamp in older versions.
timestamp = int(time.time())
return (version, token, timestamp)
else:
return None, None, None
def check_xsrf_cookie(self):
"""Verifies that the ``_xsrf`` cookie matches the ``_xsrf`` argument.