Fix reponse header sanitization.

This commit is contained in:
Ben Darnell 2012-04-23 21:55:05 -07:00
parent 15798a1d6a
commit 1ae91f6d58
2 changed files with 16 additions and 1 deletions

View File

@ -335,6 +335,16 @@ class RedirectHandler(RequestHandler):
raise Exception("didn't get permanent or status arguments")
class HeaderInjectionHandler(RequestHandler):
def get(self):
try:
self.set_header("X-Foo", "foo\r\nX-Bar: baz")
raise Exception("Didn't get expected exception")
except ValueError, e:
assert "Unsafe header value" in str(e)
self.finish(b("ok"))
class WebTest(AsyncHTTPTestCase, LogTrapTestCase):
def get_app(self):
loader = DictLoader({
@ -359,6 +369,7 @@ class WebTest(AsyncHTTPTestCase, LogTrapTestCase):
url("/flow_control", FlowControlHandler),
url("/multi_header", MultiHeaderHandler),
url("/redirect", RedirectHandler),
url("/header_injection", HeaderInjectionHandler),
]
return Application(urls,
template_loader=loader,
@ -452,6 +463,10 @@ js_embed()
response = self.fetch("/redirect?status=307", follow_redirects=False)
self.assertEqual(response.code, 307)
def test_header_injection(self):
response = self.fetch("/header_injection")
self.assertEqual(response.body, b("ok"))
class ErrorResponseTest(AsyncHTTPTestCase, LogTrapTestCase):
def get_app(self):

View File

@ -275,7 +275,7 @@ class RequestHandler(object):
# If \n is allowed into the header, it is possible to inject
# additional headers or split the request. Also cap length to
# prevent obviously erroneous values.
if len(value) > 4000 or re.match(b(r"[\x00-\x1f]"), value):
if len(value) > 4000 or re.search(b(r"[\x00-\x1f]"), value):
raise ValueError("Unsafe header value %r", value)
return value