gpt4 book ai didi

django - 出于安全原因,get_host() vs META ['REMOTE_ADDR' ]

转载 作者:行者123 更新时间:2023-12-03 21:36:44 24 4
gpt4 key购买 nike

我正在开发一个 Django 项目,用户将根据他们的位置获得自定义信息。为了做到这一点,我使用他们的 IP 地址来识别他们的国家。为了保持数据库中的数据一致,我需要确保我有一个准确的 IP。

我知道使用 META 通常使用客户端浏览器发送的 header ,但我不知道这是否适用于 REMOTE_ADDR属性。

TLDR:HttpRequest.get_host() 和有什么区别和 HttpRequest.META['REMOTE_ADDR'] ?

最佳答案

HttpRequest.get_host()的区别和 HttpRequest.META['REMOTE_ADDR']是第一个按照优先级递减的顺序检查以下 header 中的 IP:

  • HTTP_X_FORWARDED_HOST
  • HTTP_HOST
  • SERVER_NAME combined with SERVER_PORT

  • 而第二个检查标题中的 IP REMOTE_ADDR .

    返回的信息类型存在巨大差异: get_host()将为您提供托管应用程序的服务器的名称,而不是客户端的 IP。

    更详细的,这里是 get_host()的实现:
    def get_host(self):
    """Returns the HTTP host using the environment or request headers."""
    # We try three options, in order of decreasing preference.
    if settings.USE_X_FORWARDED_HOST and (
    'HTTP_X_FORWARDED_HOST' in self.META):
    host = self.META['HTTP_X_FORWARDED_HOST']
    elif 'HTTP_HOST' in self.META:
    host = self.META['HTTP_HOST']
    else:
    # Reconstruct the host using the algorithm from PEP 333.
    host = self.META['SERVER_NAME']
    server_port = str(self.META['SERVER_PORT'])
    if server_port != ('443' if self.is_secure() else '80'):
    host = '%s:%s' % (host, server_port)

    allowed_hosts = ['*'] if settings.DEBUG else settings.ALLOWED_HOSTS
    domain, port = split_domain_port(host)
    if domain and validate_host(domain, allowed_hosts):
    return host
    else:
    msg = "Invalid HTTP_HOST header: %r." % host
    if domain:
    msg += "You may need to add %r to ALLOWED_HOSTS." % domain
    raise DisallowedHost(msg)

    如果您想检查客户端 IP 地址,这里有一些值得检查的 header (请参阅 Getting the client IP address: REMOTE_ADDR, HTTP_X_FORWARDED_FOR, what else could be useful? ):
  • REMOTE_ADDR
  • HTTP_X_FORWARDED_FOR
  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FOR可以是逗号分隔的 IP 列表
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED

  • 如果您不知道选择哪一个(如果不是全部),您可以记录这些标题并随着时间的推移务实地添加新的检查。

    关于django - 出于安全原因,get_host() vs META ['REMOTE_ADDR' ],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17635471/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com