ALLOWED_HOSTS是否使用get_host()?

时间:2018-03-29 05:32:24

标签: django django-settings django-middleware

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

Django文档指出了关于ALLOWED_HOSTS的以下内容:

  

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

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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()或直接访问标题无关紧要。