Add tests for the urllib[2] vulnerability. Change to raise exceptions.
This commit is contained in:
parent
2bc23b8448
commit
f1509306d2
|
@ -122,6 +122,20 @@ class urlopen_HttpTests(unittest.TestCase):
|
|||
finally:
|
||||
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):
|
||||
"""urlopen() raises IOError if the underlying socket does not send any
|
||||
data. (#1680230) """
|
||||
|
|
|
@ -857,6 +857,27 @@ class HandlerTests(unittest.TestCase):
|
|||
self.assertEqual(count,
|
||||
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):
|
||||
# cookies shouldn't leak into redirected requests
|
||||
from cookielib import CookieJar
|
||||
|
|
|
@ -638,7 +638,8 @@ class FancyURLopener(URLopener):
|
|||
newurl = headers['uri']
|
||||
else:
|
||||
return
|
||||
|
||||
void = fp.read()
|
||||
fp.close()
|
||||
# In case the server sent a relative URL, join with original:
|
||||
newurl = basejoin(self.type + ":" + url, newurl)
|
||||
|
||||
|
@ -648,10 +649,11 @@ class FancyURLopener(URLopener):
|
|||
if not (newurl_lower.startswith('http://') or
|
||||
newurl_lower.startswith('https://') or
|
||||
newurl_lower.startswith('ftp://')):
|
||||
return
|
||||
raise IOError('redirect error', errcode,
|
||||
errmsg + " - Redirection to url '%s' is not allowed" %
|
||||
newurl,
|
||||
headers)
|
||||
|
||||
void = fp.read()
|
||||
fp.close()
|
||||
return self.open(newurl)
|
||||
|
||||
def http_error_301(self, url, fp, errcode, errmsg, headers, data=None):
|
||||
|
|
|
@ -561,7 +561,10 @@ class HTTPRedirectHandler(BaseHandler):
|
|||
if not (newurl_lower.startswith('http://') or
|
||||
newurl_lower.startswith('https://') or
|
||||
newurl_lower.startswith('ftp://')):
|
||||
return
|
||||
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
|
||||
# request, although that might interact poorly with other
|
||||
|
|
Loading…
Reference in New Issue