Skip to content

Commit 3b0169b

Browse files
Disallow usage of control characters in status, headers and values for security
1 parent ccbe41e commit 3b0169b

1 file changed

Lines changed: 9 additions & 4 deletions

File tree

Lib/wsgiref/handlers.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@
1616
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
1717
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
1818

19+
_name_disallowed = re.compile(r'[\x00-\x1F\x7F]')
20+
_value_disallowed = re.compile(r'[\x00-\x08\x0A-\x1F\x7F]')
21+
1922
def format_date_time(timestamp):
2023
year, month, day, hh, mm, ss, wd, y, z = time.gmtime(timestamp)
2124
return "%s, %02d %3s %4d %02d:%02d:%02d GMT" % (
@@ -237,13 +240,13 @@ def start_response(self, status, headers,exc_info=None):
237240

238241
self.status = status
239242
self.headers = self.headers_class(headers)
240-
status = self._convert_string_type(status, "Status")
243+
status = self._convert_string_type(status, "Status", name=False)
241244
self._validate_status(status)
242245

243246
if __debug__:
244247
for name, val in headers:
245-
name = self._convert_string_type(name, "Header name")
246-
val = self._convert_string_type(val, "Header value")
248+
name = self._convert_string_type(name, "Header name", name=True)
249+
val = self._convert_string_type(val, "Header value", name=False)
247250
assert not is_hop_by_hop(name),\
248251
f"Hop-by-hop header, '{name}: {val}', not allowed"
249252

@@ -257,9 +260,11 @@ def _validate_status(self, status):
257260
if status[3] != " ":
258261
raise AssertionError("Status message must have a space after code")
259262

260-
def _convert_string_type(self, value, title):
263+
def _convert_string_type(self, value, title, *, name=True):
261264
"""Convert/check value type."""
262265
if type(value) is str:
266+
if (_name_disallowed if name else _value_disallowed).search(value):
267+
raise ValueError("Control characters not allowed in headers and values")
263268
return value
264269
raise AssertionError(
265270
"{0} must be of type str (got {1})".format(title, repr(value))

0 commit comments

Comments
 (0)