【问题标题】:Django - links generated with {% url %} - how to make them secure?Django - 使用 {% url %} 生成的链接 - 如何使它们安全?
【发布时间】:2009-11-23 20:05:57
【问题描述】:

如果我想为用户提供使用https:// 而不是http:// 登录网站的选项,我最好在我的视图或模板中为他们提供一个选项。

我想在我的登录页面上添加“使用安全连接”链接 - 但是,如何在不对 URL 进行硬编码的情况下做到这一点?

我希望能够做到:

{% url login_page %}
{% url login_page_https %} 

并让它们指向http://example.com/loginhttps://example.com/login

我该怎么做?

【问题讨论】:

  • 奇怪的是,当 https 可用时,为什么任何用户都想通过 http 登录?
  • 因为他们的代理只允许 80 端口通过(这种异常情况见了几次)

标签: django https url-routing


【解决方案1】:

{% url %} 标记仅生成 URL 的路径部分,而不是主机部分。它只生成类似“/path/to/here”的内容(您需要做的就是“查看源代码”,您会看到这是href 的全部内容)。如果您当前在http://example.com 上,则您的浏览器会假定该链接也应该在http://example.com 内。因此,在模板中生成安全链接所需要做的就是:

<a href="https://example.com{% url blah %}">

如果您不想对域名进行硬编码(我也不会),您可以使用 the Site object 并让它看起来像:

<a href="https://{{ site.domain }}{% url blah %}">

或者如果你不想使用站点框架,你可以使用request.get_host:

<a href="https://{{ request.get_host }}{% url blah %}">

【讨论】:

  • 这有 1 个缺点;当/如果我将站点移动到不同的域或类似的域时,相对 URL 不会中断,这个会。我一直在寻找更像 request.build_absolute_uri() 的函数,可以选择用 https 替换 http,但我想最好自己实现。
  • 好吧,没有办法强制使用 https 并使用相对 URL。编辑提到您可以使用站点框架来避免对域名进行硬编码。
  • 上述使用 request.get_host 的选项本质上与 request.get_absolute_uri 做同样的事情并强制 https。
【解决方案2】:

我在安全 url 方面工作不多,但我在 satchmo 方面做了一些工作,它有一个中间件和一些实用程序。中间件只检查视图参数中的密钥SSL = True,并以这种方式使请求安全。你可能不需要让它那么复杂,但你可以看看它是如何实现的。

Satchmo 正在使用 bitbucked here

我还能够找到一个用于中间件的 sn-ps,它也应该能够帮助您获得一个安全的登录网址:

第一个是原始版本,而第二个应该是经过改进的版本,在某些时候,但可能不再是这种情况了。你可以看看他们。

使用 satchmo 或其中一个中间件 sn-ps 您应该能够执行类似的操作

{% url login_page %}
{% url login_page SSL=1 %}

【讨论】:

  • 如果您想将某些 URL 定义为仅限 https,然后让中间件从那里处理它,那么链接的 sn-ps 是一个很好的综合解决方案。如果您只想创建一个 https 链接,那么它们就太过分了。
  • 没错,仅对于一个链接,这是不值得的。在这种情况下,您的解决方案会更好。
【解决方案3】:

也许您可以编写一个标签url_https,它与url 做同样的事情,但指向网址的HTTPS 版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多