Commit ec67af0b authored by Jacob Kaplan-Moss's avatar Jacob Kaplan-Moss
Browse files

Fixed is_safe_url() to reject URLs that use a scheme other than HTTP/S.

This is a security fix; disclosure to follow shortly.
parent b50be685
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -309,7 +309,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,
@@ -330,6 +331,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' % {
@@ -467,7 +469,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,
@@ -486,6 +489,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' % {
+4 −3
Original line number Diff line number Diff line
@@ -228,11 +228,12 @@ else:
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 = urlparse.urlparse(url)[1]
    return not netloc or netloc == host
    url_info = urlparse.urlparse(url)
    return (not url_info[1] or url_info[1] == host) and \
        (not url_info[0] or url_info[0] in ['http', 'https'])