【问题标题】:How to enable https in Django-auth generated pages?如何在 Django-auth 生成的页面中启用 https?
【发布时间】:2023-03-26 22:16:02
【问题描述】:

使用Django-auth 应用程序(Django 1.3 版),我想让我的登录页面转到https://mysite.com/login/。目前,我正在使用:

# urls.py
from django.contrib.auth.views import login
urlpatterns = patterns('', url(r'^login/$', login, name='login-view'),)

# navbar.html
<li id="nav-login"><a href="{% url login-view %}" ><b>Login</b></a></li>

效果很好,但转到http://mysite.com/login/

当 Django-auth 反转视图名称时,有什么方法可以告诉 Django-auth 使用什么前缀 (https)?我已经阅读了整个手册页,但没有找到任何涵盖它的内容。或者也许是某种方式告诉url 标签去https?

或者是手动指定整个 URL 的唯一选项?我希望不会 :) 鉴于 Django 迄今为止的强大,我不敢相信它没有这种能力——我一定是忽略了它。 :)

【问题讨论】:

  • 在你的服务器上做一个301不是更容易吗?我无法想象用户会倾向于不使用 SSL 的情况

标签: django https django-authentication


【解决方案1】:

正如在其他 StackOverflow 问题中所见,您可以 implement middleware 自动将登录页面重定向到安全版本。

如果您真的很重视安全性,您可能应该将整个网站迁移到 SSL。来自 EFF 的How to Deploy HTTPS Correctly

您必须通过 HTTPS 为整个应用程序域提供服务。将带有 HTTP 301 或 302 响应的 HTTP 请求重定向到等效的 HTTPS 资源。

一些站点运营商仅通过 HTTPS 提供登录页面,理论上只有用户的密码是敏感的。这些网站的用户容易受到被动和主动攻击。

【讨论】:

    【解决方案2】:

    将操作系统环境变量 HTTPS 设置为开启

    您需要启用 OS 环境变量 HTTPS'on' 以便 django 将 https 附加到完全生成的链接(例如,与 HttpRedirectRequests 一样)。如果您使用的是 mod_wsgi,则可以添加以下行:

    os.environ['HTTPS'] = "on"
    

    发送至您的wsgi script。您可以通过阅读django/http/__init__.py 看到对此的需求:

    def build_absolute_uri(self, location=None):
        """
        Builds an absolute URI from the location and the variables available in
        this request. If no location is specified, the absolute URI is built on
        ``request.get_full_path()``.
        """
        if not location:
            location = self.get_full_path()
        if not absolute_http_url_re.match(location):
            current_uri = '%s://%s%s' % (self.is_secure() and 'https' or 'http',
                                         self.get_host(), self.path)
            location = urljoin(current_uri, location)
        return iri_to_uri(location)
    
    def is_secure(self):
        return os.environ.get("HTTPS") == "on"
    

    保护您的 cookie

    settings.py 中放行

    SESSION_COOKIE_SECURE = True
    CSRF_COOKIE_SECURE = True
    

    并且 cookie 将仅通过 HTTPS 连接发送。此外,您可能还需要SESSION_EXPIRE_AT_BROWSER_CLOSE=True。请注意,如果您使用的是旧版本的 django(低于 1.4),则没有安全 CSRF cookie 的设置。作为快速修复,您可以在会话 cookie 安全 (SESSION_COOKIE_SECURE=True) 时让 CSRF cookie 保持安全,方法是编辑 django/middleware/csrf.py

    class CsrfViewMiddleware(object):
       ...
       def process_response(self, request, response):
           ...
           response.set_cookie(settings.CSRF_COOKIE_NAME,
                request.META["CSRF_COOKIE"], max_age = 60 * 60 * 24 * 7 * 52,
                domain=settings.CSRF_COOKIE_DOMAIN,
                secure=settings.SESSION_COOKIE_SECURE or None)
    

    将 HTTP 请求定向到网络服务器中的 HTTPS

    接下来,您需要一个重写规则,将 http 请求重定向到 https,例如,在 nginx 中

    server {
       listen 80;
       rewrite ^(.*) https://$host$1 permanent;
    }
    

    Django的reverse函数和url模板标签只返回相对链接;因此,如果您在 https 页面上,您的链接将使您留在 https 网站上。

    【讨论】:

      猜你喜欢
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 2019-12-13
      • 2022-07-03
      • 1970-01-01
      相关资源
      最近更新 更多