mirror of https://github.com/python/cpython.git
Merge issue 11662 from 2.6.
This commit is contained in:
commit
07ef62c47c
|
@ -161,6 +161,20 @@ def test_read_bogus(self):
|
||||||
finally:
|
finally:
|
||||||
self.unfakehttp()
|
self.unfakehttp()
|
||||||
|
|
||||||
|
def test_invalid_redirect(self):
|
||||||
|
# urlopen() should raise IOError for many error codes.
|
||||||
|
self.fakehttp("""HTTP/1.1 302 Found
|
||||||
|
Date: Wed, 02 Jan 2008 03:03:54 GMT
|
||||||
|
Server: Apache/1.3.33 (Debian GNU/Linux) mod_ssl/2.8.22 OpenSSL/0.9.7e
|
||||||
|
Location: file:README
|
||||||
|
Connection: close
|
||||||
|
Content-Type: text/html; charset=iso-8859-1
|
||||||
|
""")
|
||||||
|
try:
|
||||||
|
self.assertRaises(IOError, urllib.urlopen, "http://python.org/")
|
||||||
|
finally:
|
||||||
|
self.unfakehttp()
|
||||||
|
|
||||||
def test_empty_socket(self):
|
def test_empty_socket(self):
|
||||||
# urlopen() raises IOError if the underlying socket does not send any
|
# urlopen() raises IOError if the underlying socket does not send any
|
||||||
# data. (#1680230)
|
# data. (#1680230)
|
||||||
|
|
|
@ -969,6 +969,27 @@ def redirect(h, req, url=to_url):
|
||||||
self.assertEqual(count,
|
self.assertEqual(count,
|
||||||
urllib2.HTTPRedirectHandler.max_redirections)
|
urllib2.HTTPRedirectHandler.max_redirections)
|
||||||
|
|
||||||
|
def test_invalid_redirect(self):
|
||||||
|
from_url = "http://example.com/a.html"
|
||||||
|
valid_schemes = ['http', 'https', 'ftp']
|
||||||
|
invalid_schemes = ['file', 'imap', 'ldap']
|
||||||
|
schemeless_url = "example.com/b.html"
|
||||||
|
h = urllib2.HTTPRedirectHandler()
|
||||||
|
o = h.parent = MockOpener()
|
||||||
|
req = Request(from_url)
|
||||||
|
|
||||||
|
for scheme in invalid_schemes:
|
||||||
|
invalid_url = scheme + '://' + schemeless_url
|
||||||
|
self.assertRaises(urllib2.HTTPError, h.http_error_302,
|
||||||
|
req, MockFile(), 302, "Security Loophole",
|
||||||
|
MockHeaders({"location": invalid_url}))
|
||||||
|
|
||||||
|
for scheme in valid_schemes:
|
||||||
|
valid_url = scheme + '://' + schemeless_url
|
||||||
|
h.http_error_302(req, MockFile(), 302, "That's fine",
|
||||||
|
MockHeaders({"location": valid_url}))
|
||||||
|
self.assertEqual(o.req.get_full_url(), valid_url)
|
||||||
|
|
||||||
def test_cookie_redirect(self):
|
def test_cookie_redirect(self):
|
||||||
# cookies shouldn't leak into redirected requests
|
# cookies shouldn't leak into redirected requests
|
||||||
from cookielib import CookieJar
|
from cookielib import CookieJar
|
||||||
|
|
|
@ -644,6 +644,18 @@ def redirect_internal(self, url, fp, errcode, errmsg, headers, data):
|
||||||
fp.close()
|
fp.close()
|
||||||
# In case the server sent a relative URL, join with original:
|
# In case the server sent a relative URL, join with original:
|
||||||
newurl = basejoin(self.type + ":" + url, newurl)
|
newurl = basejoin(self.type + ":" + url, newurl)
|
||||||
|
|
||||||
|
# For security reasons we do not allow redirects to protocols
|
||||||
|
# other than HTTP, HTTPS or FTP.
|
||||||
|
newurl_lower = newurl.lower()
|
||||||
|
if not (newurl_lower.startswith('http://') or
|
||||||
|
newurl_lower.startswith('https://') or
|
||||||
|
newurl_lower.startswith('ftp://')):
|
||||||
|
raise IOError('redirect error', errcode,
|
||||||
|
errmsg + " - Redirection to url '%s' is not allowed" %
|
||||||
|
newurl,
|
||||||
|
headers)
|
||||||
|
|
||||||
return self.open(newurl)
|
return self.open(newurl)
|
||||||
|
|
||||||
def http_error_301(self, url, fp, errcode, errmsg, headers, data=None):
|
def http_error_301(self, url, fp, errcode, errmsg, headers, data=None):
|
||||||
|
|
|
@ -578,6 +578,17 @@ def http_error_302(self, req, fp, code, msg, headers):
|
||||||
|
|
||||||
newurl = urlparse.urljoin(req.get_full_url(), newurl)
|
newurl = urlparse.urljoin(req.get_full_url(), newurl)
|
||||||
|
|
||||||
|
# For security reasons we do not allow redirects to protocols
|
||||||
|
# other than HTTP, HTTPS or FTP.
|
||||||
|
newurl_lower = newurl.lower()
|
||||||
|
if not (newurl_lower.startswith('http://') or
|
||||||
|
newurl_lower.startswith('https://') or
|
||||||
|
newurl_lower.startswith('ftp://')):
|
||||||
|
raise HTTPError(newurl, code,
|
||||||
|
msg + " - Redirection to url '%s' is not allowed" %
|
||||||
|
newurl,
|
||||||
|
headers, fp)
|
||||||
|
|
||||||
# XXX Probably want to forget about the state of the current
|
# XXX Probably want to forget about the state of the current
|
||||||
# request, although that might interact poorly with other
|
# request, although that might interact poorly with other
|
||||||
# handlers that also use handler-specific request attributes
|
# handlers that also use handler-specific request attributes
|
||||||
|
|
|
@ -16,6 +16,9 @@ Core and Builtins
|
||||||
- Issue #11450: Don't truncate hg version info in Py_GetBuildInfo() when
|
- Issue #11450: Don't truncate hg version info in Py_GetBuildInfo() when
|
||||||
there are many tags (e.g. when using mq). Patch by Nadeem Vawda.
|
there are many tags (e.g. when using mq). Patch by Nadeem Vawda.
|
||||||
|
|
||||||
|
- Issue #11662: Make urllib and urllib2 ignore redirections if the
|
||||||
|
scheme is not HTTP, HTTPS or FTP (CVE-2011-1521).
|
||||||
|
|
||||||
- Issue #10451: memoryview objects could allow to mutate a readable buffer.
|
- Issue #10451: memoryview objects could allow to mutate a readable buffer.
|
||||||
Initial patch by Ross Lagerwall.
|
Initial patch by Ross Lagerwall.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue