Fixed is_safe_url() to reject URLs that use a scheme other than HTTP/S.
This is a security fix; disclosure to follow shortly.
This commit is contained in:
parent
09a5f5aabe
commit
ae3535169a
|
@ -446,7 +446,8 @@ class LoginTest(AuthViewsTestCase):
|
|||
for bad_url in ('http://example.com',
|
||||
'https://example.com',
|
||||
'ftp://exampel.com',
|
||||
'//example.com'):
|
||||
'//example.com',
|
||||
'javascript:alert("XSS")'):
|
||||
|
||||
nasty_url = '%(url)s?%(next)s=%(bad_url)s' % {
|
||||
'url': login_url,
|
||||
|
@ -467,6 +468,7 @@ class LoginTest(AuthViewsTestCase):
|
|||
'/view?param=ftp://exampel.com',
|
||||
'view/?param=//example.com',
|
||||
'https:///',
|
||||
'HTTPS:///',
|
||||
'//testserver/',
|
||||
'/url%20with%20spaces/'): # see ticket #12534
|
||||
safe_url = '%(url)s?%(next)s=%(good_url)s' % {
|
||||
|
@ -661,7 +663,8 @@ class LogoutTest(AuthViewsTestCase):
|
|||
for bad_url in ('http://example.com',
|
||||
'https://example.com',
|
||||
'ftp://exampel.com',
|
||||
'//example.com'):
|
||||
'//example.com',
|
||||
'javascript:alert("XSS")'):
|
||||
nasty_url = '%(url)s?%(next)s=%(bad_url)s' % {
|
||||
'url': logout_url,
|
||||
'next': REDIRECT_FIELD_NAME,
|
||||
|
@ -680,6 +683,7 @@ class LogoutTest(AuthViewsTestCase):
|
|||
'/view?param=ftp://exampel.com',
|
||||
'view/?param=//example.com',
|
||||
'https:///',
|
||||
'HTTPS:///',
|
||||
'//testserver/',
|
||||
'/url%20with%20spaces/'): # see ticket #12534
|
||||
safe_url = '%(url)s?%(next)s=%(good_url)s' % {
|
||||
|
|
|
@ -252,11 +252,12 @@ def same_origin(url1, url2):
|
|||
def is_safe_url(url, host=None):
|
||||
"""
|
||||
Return ``True`` if the url is a safe redirection (i.e. it doesn't point to
|
||||
a different host).
|
||||
a different host and uses a safe scheme).
|
||||
|
||||
Always returns ``False`` on an empty url.
|
||||
"""
|
||||
if not url:
|
||||
return False
|
||||
netloc = urllib_parse.urlparse(url)[1]
|
||||
return not netloc or netloc == host
|
||||
url_info = urllib_parse.urlparse(url)
|
||||
return (not url_info.netloc or url_info.netloc == host) and \
|
||||
(not url_info.scheme or url_info.scheme in ['http', 'https'])
|
||||
|
|
Loading…
Reference in New Issue