diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2020-03-14 19:13:32 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-03-14 19:13:32 (GMT) |
commit | ff69c9d12c1b06af58e5eae5db4630cedd94740e (patch) | |
tree | 86d9500a8490bb3470c1941be6905c7df0340030 /Lib/http/client.py | |
parent | a927e91186727b5184d774d1d99c70b9ff5497f5 (diff) | |
download | cpython-ff69c9d12c1b06af58e5eae5db4630cedd94740e.zip cpython-ff69c9d12c1b06af58e5eae5db4630cedd94740e.tar.gz cpython-ff69c9d12c1b06af58e5eae5db4630cedd94740e.tar.bz2 |
bpo-38576: Disallow control characters in hostnames in http.client (GH-18995)
Add host validation for control characters for more CVE-2019-18348 protection.
(cherry picked from commit 9165addc22d05e776a54319a8531ebd0b2fe01ef)
Co-authored-by: Ashwin Ramaswami <aramaswamis@gmail.com>
Diffstat (limited to 'Lib/http/client.py')
-rw-r--r-- | Lib/http/client.py | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/Lib/http/client.py b/Lib/http/client.py index 33a4347..019380a 100644 --- a/Lib/http/client.py +++ b/Lib/http/client.py @@ -828,6 +828,8 @@ class HTTPConnection: (self.host, self.port) = self._get_hostport(host, port) + self._validate_host(self.host) + # This is stored as an instance variable to allow unit # tests to replace it with a suitable mockup self._create_connection = socket.create_connection @@ -1183,6 +1185,14 @@ class HTTPConnection: raise InvalidURL(f"URL can't contain control characters. {url!r} " f"(found at least {match.group()!r})") + def _validate_host(self, host): + """Validate a host so it doesn't contain control characters.""" + # Prevent CVE-2019-18348. + match = _contains_disallowed_url_pchar_re.search(host) + if match: + raise InvalidURL(f"URL can't contain control characters. {host!r} " + f"(found at least {match.group()!r})") + def putheader(self, header, *values): """Send a request header line to the server. |