Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
9a9fdfad
Commit
9a9fdfad
authored
Mar 29, 2011
by
guido@google.com
Browse files
Options
Browse Files
Download
Plain Diff
Merge urllib/urllib2 security fix from 2.5 branch.
parents
f23c515e
92ecb873
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
61 additions
and
0 deletions
+61
-0
Lib/test/test_urllib.py
Lib/test/test_urllib.py
+14
-0
Lib/test/test_urllib2.py
Lib/test/test_urllib2.py
+22
-0
Lib/urllib.py
Lib/urllib.py
+12
-0
Lib/urllib2.py
Lib/urllib2.py
+11
-0
Misc/NEWS
Misc/NEWS
+2
-0
No files found.
Lib/test/test_urllib.py
View file @
9a9fdfad
...
...
@@ -162,6 +162,20 @@ Content-Type: text/html; charset=iso-8859-1
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)
...
...
Lib/test/test_urllib2.py
View file @
9a9fdfad
...
...
@@ -942,6 +942,28 @@ 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
)
req
.
timeout
=
socket
.
_GLOBAL_DEFAULT_TIMEOUT
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
...
...
Lib/urllib.py
View file @
9a9fdfad
...
...
@@ -652,6 +652,18 @@ class FancyURLopener(URLopener):
fp
.
close
()
# In case the server sent a relative URL, join with original:
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
)
def
http_error_301
(
self
,
url
,
fp
,
errcode
,
errmsg
,
headers
,
data
=
None
):
...
...
Lib/urllib2.py
View file @
9a9fdfad
...
...
@@ -578,6 +578,17 @@ class HTTPRedirectHandler(BaseHandler):
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
# request, although that might interact poorly with other
# handlers that also use handler-specific request attributes
...
...
Misc/NEWS
View file @
9a9fdfad
...
...
@@ -12,6 +12,8 @@ What's New in Python 2.6.7?
*NOTE: Python 2.6 is in security-fix-only mode. No non-security bug fixes are
allowed. Python 2.6.7 and beyond will be source only releases.*
- Issue #11662: Make urllib and urllib2 ignore redirections if the
scheme is not HTTP, HTTPS or FTP (CVE-2011-1521).
Core and Builtins
-----------------
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment