summaryrefslogtreecommitdiffstats
path: root/Lib/urllib/request.py
diff options
context:
space:
mode:
authorguido@google.com <guido@google.com>2011-03-29 19:02:49 (GMT)
committerguido@google.com <guido@google.com>2011-03-29 19:02:49 (GMT)
commit2008a8f8c09b18fbd24e8039553d50a828dd3fb2 (patch)
treec78fd200fde6b54d7c1138fed8b0cbe840b583c7 /Lib/urllib/request.py
parentd4652fab512910ef501b6c62aca5f19bf18bfe74 (diff)
parentc768ff5d4f69f94455db82646e004fac4d11876e (diff)
downloadcpython-2008a8f8c09b18fbd24e8039553d50a828dd3fb2.zip
cpython-2008a8f8c09b18fbd24e8039553d50a828dd3fb2.tar.gz
cpython-2008a8f8c09b18fbd24e8039553d50a828dd3fb2.tar.bz2
Merge Issue 11662 from 3.2 branch.
Diffstat (limited to 'Lib/urllib/request.py')
-rw-r--r--Lib/urllib/request.py27
1 files changed, 27 insertions, 0 deletions
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 0aa7a77..304bf59 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -545,6 +545,17 @@ class HTTPRedirectHandler(BaseHandler):
# fix a possible malformed URL
urlparts = urlparse(newurl)
+
+ # For security reasons we don't allow redirection to anything other
+ # than http, https or ftp.
+
+ if not urlparts.scheme in ('http', 'https', 'ftp'):
+ raise HTTPError(newurl, code,
+ msg +
+ " - Redirection to url '%s' is not allowed" %
+ newurl,
+ headers, fp)
+
if not urlparts.path:
urlparts = list(urlparts)
urlparts[2] = "/"
@@ -1903,8 +1914,24 @@ class FancyURLopener(URLopener):
return
void = fp.read()
fp.close()
+
# In case the server sent a relative URL, join with original:
newurl = urljoin(self.type + ":" + url, newurl)
+
+ urlparts = urlparse(newurl)
+
+ # For security reasons, we don't allow redirection to anything other
+ # than http, https and ftp.
+
+ # We are using newer HTTPError with older redirect_internal method
+ # This older method will get deprecated in 3.3
+
+ if not urlparts.scheme in ('http', 'https', 'ftp'):
+ raise HTTPError(newurl, errcode,
+ errmsg +
+ " Redirection to url '%s' is not allowed." % newurl,
+ headers, fp)
+
return self.open(newurl)
def http_error_301(self, url, fp, errcode, errmsg, headers, data=None):