mirror of
https://github.com/python/cpython.git
synced 2024-11-24 10:24:35 +08:00
bpo-30458: Use InvalidURL instead of ValueError. (GH-13044)
Use http.client.InvalidURL instead of ValueError as the new error case's exception.
This commit is contained in:
parent
e1d5dd645d
commit
b7378d7728
@ -1091,7 +1091,7 @@ class HTTPConnection:
|
||||
url = '/'
|
||||
# Prevent CVE-2019-9740.
|
||||
if match := _contains_disallowed_url_pchar_re.search(url):
|
||||
raise ValueError(f"URL can't contain control characters. {url!r} "
|
||||
raise InvalidURL(f"URL can't contain control characters. {url!r} "
|
||||
f"(found at least {match.group()!r})")
|
||||
request = '%s %s %s' % (method, url, self._http_vsn_str)
|
||||
|
||||
|
@ -343,11 +343,12 @@ class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin):
|
||||
# calls urllib.parse.quote() on the URL which makes all of the
|
||||
# above attempts at injection within the url _path_ safe.
|
||||
escaped_char_repr = repr(char).replace('\\', r'\\')
|
||||
InvalidURL = http.client.InvalidURL
|
||||
with self.assertRaisesRegex(
|
||||
ValueError, f"contain control.*{escaped_char_repr}"):
|
||||
InvalidURL, f"contain control.*{escaped_char_repr}"):
|
||||
urllib.request.urlopen(f"http:{schemeless_url}")
|
||||
with self.assertRaisesRegex(
|
||||
ValueError, f"contain control.*{escaped_char_repr}"):
|
||||
InvalidURL, f"contain control.*{escaped_char_repr}"):
|
||||
urllib.request.urlopen(f"https:{schemeless_url}")
|
||||
# This code path quotes the URL so there is no injection.
|
||||
resp = urlopen(f"http:{schemeless_url}")
|
||||
@ -367,10 +368,11 @@ class urlopen_HttpTests(unittest.TestCase, FakeHTTPMixin, FakeFTPMixin):
|
||||
# urlopen uses FancyURLOpener which goes via a codepath that
|
||||
# calls urllib.parse.quote() on the URL which makes all of the
|
||||
# above attempts at injection within the url _path_ safe.
|
||||
InvalidURL = http.client.InvalidURL
|
||||
with self.assertRaisesRegex(
|
||||
ValueError, r"contain control.*\\r.*(found at least . .)"):
|
||||
InvalidURL, r"contain control.*\\r.*(found at least . .)"):
|
||||
urllib.request.urlopen(f"http:{schemeless_url}")
|
||||
with self.assertRaisesRegex(ValueError, r"contain control.*\\n"):
|
||||
with self.assertRaisesRegex(InvalidURL, r"contain control.*\\n"):
|
||||
urllib.request.urlopen(f"https:{schemeless_url}")
|
||||
# This code path quotes the URL so there is no injection.
|
||||
resp = urlopen(f"http:{schemeless_url}")
|
||||
|
@ -1 +1 @@
|
||||
Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause a ValueError to be raised.
|
||||
Address CVE-2019-9740 by disallowing URL paths with embedded whitespace or control characters through into the underlying http client request. Such potentially malicious header injection URLs now cause an http.client.InvalidURL exception to be raised.
|
Loading…
Reference in New Issue
Block a user