【Django】webサイトにアクセスしたクライアントのIPアドレスを取得する

クライアントのIPアドレスを取得することができれば、不正なサイト回遊をするクライアントや、犯罪などの抑止力として一定の効果を上げることができます。

本日はそんな、webサイトにアクセスしたクライアントのIPアドレスを取得する方法を紹介していきます。

コード

それでは早速コードを紹介していきます。

views.py

def index(request):
    -
    -
    -
    client_ip = request.META.get('REMOTE_ADDR')
    print(client_ip) # 127.0.0.1

「え?これだけ?」

と思う人もいるかもしれませんが、そうは問屋が卸しません。

上記のような書き方は、クライアントがDjangoに直接アクセスする開発環境の類のみ決まった書き方です。

そうして当然のことながら、IPアドレスは127.0.0.1になります。

ではクライアントとdjangoの間にnginxのようなリバースプロキシがある場合の書き方はどのようにすれば良いのでしょうか?

nginxなどの本番環境での書き方

djangoの間にnginxのようなリバースプロキシを使用した場合、大抵の場合HTTPヘッダに転送先情報として’HTTP_X_FORWARDED_FOR’などを書いていることが多いです。

つまりこの先頭要素からクライアントのIPアドレスを取得することができます。

そしてそのための書き方は以下になります。

views.py

def index(request):
    -
    -
    -
    # 'HTTP_X_FORWARDED_FOR'ヘッダから転送経路のIPアドレスを取得
    forwarded_addresses = request.META.get('HTTP_X_FORWARDED_FOR')
    if forwarded_addresses:
        # 'HTTP_X_FORWARDED_FOR'ヘッダがある場合は転送経路の先頭要素を取得
        client_ip = forwarded_addresses.split(',')[0]
    else:
        # 'HTTP_X_FORWARDED_FOR'ヘッダがない場合は'REMOTE_ADDR'ヘッダを参照
        client_ip = request.META.get('REMOTE_ADDR')

    print(client_ip) # xxx.xx.xxx.xx

これでclient_ipアドレスから、どこの誰か何をしているのかがわかります。

しかしながら、プロバイダーから割り当てられているIPアドレスは恒常的ではなく変わることも多く、不確実性が高いことも事実であります。

以上。

最後に

ipwareなどのようなモジュールを使用してipアドレスを取得することも可能ですが、特にそこまでモジュールにこだわって使用する必要もないかと思いますので、最低限の実装でIPアドレスを取得できれば問題はないのではないでしょうか。

以上が、「【Django】webサイトにアクセスしたクライアントのIPアドレスを取得する」の紹介記事になります。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です