5

私は、ユーザーが自分の場所に応じてカスタム情報を提供する Django プロジェクトに取り組んでいます。これを行うために、IP アドレスを使用して国を識別します。データベース内のデータの一貫性を保つために、正確な IP を持っていることを確認する必要があります。

REMOTE_ADDRMETA を使用すると、通常、クライアントのブラウザーから送信されたヘッダーが使用されることは理解していますが、それが属性に適用されるかどうかはわかりません。

HttpRequest.get_host()TLDR:との違いは何HttpRequest.META['REMOTE_ADDR']ですか?

4

1 に答える 1

6

HttpRequest.get_host()との違いHttpRequest.META['REMOTE_ADDR']は、最初の 1 つが優先度の高い順に次のヘッダーで IP をチェックすることです。

  1. HTTP_X_FORWARDED_HOST
  2. HTTP_HOST
  3. SERVER_NAME combined with SERVER_PORT

一方、2 つ目はヘッダーの 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 アドレスを確認したい場合は、確認する価値のあるヘッダーをいくつか示します (クライアント IP アドレスの取得: REMOTE_ADDR、HTTP_X_FORWARDED_FOR、他に役立つものはありますか? を参照)。

  • REMOTE_ADDR
  • HTTP_X_FORWARDED_FOR
  • HTTP_CLIENT_IP
  • HTTP_X_FORWARDED_FORIP のカンマ区切りのリストにすることができます
  • HTTP_X_FORWARDED
  • HTTP_X_CLUSTER_CLIENT_IP
  • HTTP_FORWARDED_FOR
  • HTTP_FORWARDED

どれを選択すればよいかわからない場合 (すべてではないにしても)、それらのヘッダーをログに記録し、時間をかけて新しいチェックを実用的に追加できます。

于 2013-07-14T01:28:07.303 に答える