【问题标题】:Does ALLOWED_HOSTS use get_host()?ALLOWED_HOSTS 是否使用 get_host()?
【发布时间】:2018-09-07 23:27:09
【问题描述】:

当谈到 django 如何使用 ALLOWED_HOSTS 中的元组来验证主机时,我有点困惑。它是使用get_host() 调用还是使用request.META

Django 文档针对ALLOWED_HOSTS 指出以下内容:

此验证仅适用于get_host();如果您的代码直接从request.META 访问Host 标头,则您将绕过此安全保护。

如果我创建使用get_host() 获取主机并将其与已批准主机名列表进行比较的中间件,如果域不在列表中,则传递用户404,我认为这基本上是复制ALLOWED_HOSTS 功能?

我问这个问题是因为我确实需要写中间件来代替ALLOWED_HOSTS。随着越来越多的用户注册,批准的主机列表会随着时间的推移而增长。结果,我验证的元组是动态的,因此,我不能在 Django 中使用默认的 ALLOWED_HOSTS 配置。

谢谢!

【问题讨论】:

  • 你读过get_host的实现吗?这很不言自明。
  • 不。我只是想知道 django 使用 ALLOWED_HOSTS 进行的主机验证是否使用了 get_host() 方法。

标签: django django-settings django-middleware


【解决方案1】:

ALLOWED_HOSTS 不使用任何东西,它只是一个列表。反之亦然:get_host() 使用 ALLOWED_HOSTS 来验证 Host 标头的值。您链接到的文档明确说明了这一点:

如果Host 标头(或X-Forwarded-Host,如果USE_X_FORWARDED_HOST 启用)不匹配此列表中的任何值,django.http.HttpRequest.get_host() 方法将引发SuspiciousOperation

如果您想用自己的验证替换此验证,只需将 * 用于 ALLOWED_HOSTS。由于在这种情况下任何主机都会通过验证,因此无论您使用 get_host() 还是直接访问标头都没有关系。

【讨论】:

    猜你喜欢
    • 2017-06-07
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2018-02-17
    • 2016-06-21
    相关资源
    最近更新 更多