Skip to content

Commit 79f25b9

Browse files
committed
urllib.parse.parse_qsl now raises ValueError if illegal characters is passed
1 parent 4357302 commit 79f25b9

File tree

2 files changed

+15
-0
lines changed

2 files changed

+15
-0
lines changed

Lib/test/test_urlparse.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1227,6 +1227,13 @@ def test_parse_qs_encoding(self):
12271227
errors="ignore")
12281228
self.assertEqual(result, {'key': ['\u0141-']})
12291229

1230+
def test_qsl_strict_parsing_raises(self):
1231+
with self.assertRaises(ValueError):
1232+
urllib.parse.parse_qsl("foo", strict_parsing=True)
1233+
1234+
with self.assertRaises(ValueError):
1235+
urllib.parse.parse_qsl(b"foo", strict_parsing=True)
1236+
12301237
def test_parse_qsl_encoding(self):
12311238
result = urllib.parse.parse_qsl("key=\u0141%E9", encoding="latin-1")
12321239
self.assertEqual(result, [('key', '\u0141\xE9')])

Lib/urllib/parse.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@
9191
# Unsafe bytes to be removed per WHATWG spec
9292
_UNSAFE_URL_BYTES_TO_REMOVE = ['\t', '\r', '\n']
9393

94+
# Allowed valid characters in parse_qsl
95+
_VALID_QUERY_CHARS = re.compile(r"^[A-Za-z0-9\-._~!$&'()*+,;=:@/?%]*$")
96+
9497
def clear_cache():
9598
"""Clear internal performance caches. Undocumented; some tests want it."""
9699
urlsplit.cache_clear()
@@ -854,6 +857,11 @@ def _unquote(s):
854857
name, has_eq, value = name_value.partition(eq)
855858
if not has_eq and strict_parsing:
856859
raise ValueError("bad query field: %r" % (name_value,))
860+
if strict_parsing:
861+
# Validate RFC3986 characters
862+
to_check = (name_value.decode() if isinstance(name_value, bytes) else name_value)
863+
if not _VALID_QUERY_CHARS.match(to_check):
864+
raise ValueError(f"Invalid characters in query string per RFC 3986: {name_value!r}")
857865
if value or keep_blank_values:
858866
name = _unquote(name)
859867
value = _unquote(value)

0 commit comments

Comments
 (0)