Python
 Computer >> コンピューター >  >> プログラミング >> Python

DjangoでPOSTリクエストの送信元IPアドレスを取得する方法

本記事では、DjangoでPOSTリクエストを受け取った際に、その送信元IPアドレスを取得する方法を解説します。

Webアプリケーションを運用していると、セキュリティ対策の一環としてアクセス元のIPアドレスを把握したくなる場面が多々あります。例えば、悪意のある特定のIPアドレスをブロック(BAN)したい場合や、同一のIPから短時間に大量のリクエストが送られていないか(不正なスパム行為やDoS攻撃の兆候)を監視したい場合などが挙げられます。

こうした処理は、サードパーティ製パッケージdjango-ipwareを使えば、ごく簡単に実装できます。それでは実際の手順を見ていきましょう。

事前準備

まず、Djangoプロジェクトとアプリケーションを作成し、INSTALLED_APPSにアプリを追加する、urls.pyを設定するといった基本セットアップを行ってください。なお、本記事ではDjangoのフォーム(forms)やモデル(models)は使用しません。

1. django-ipwareのインストール

以下のコマンドでdjango-ipwareパッケージをインストールします。

pip install django-ipware

このパッケージはsettings.pyなどの特別な設定を必要としません。インストールするだけですぐに使えるのが魅力です。

2. テンプレートの作成

次に、Templates → home.htmlを作成し、以下のコードを記述します。

<!DOCTYPE html>
<html>
    <head>
        <title>tut</title>
    </head>
    <body>

        <form method="post" action='/'
enctype="multipart/form-data">
            <input type="text" id="text"/>
            <input type="submit" value="submit"/>
        </form>
    </body>
</html>

ここでは単純なテキスト入力欄と送信ボタンを持つフォームを作成しました。このフォームからPOSTリクエストを送信し、その際のIPアドレスを確認します。

3. URLルーティングの設定

アプリ側のurls.pyに以下を記述します。

from django.urls import path, include
from . import views
urlpatterns = [
    path('',views.home,name='home'),
]

これでトップページへのアクセスがviews.py内のhomeビューにルーティングされます。

4. ビューでIPアドレスを取得する

views.pyに以下のように記述します。

from django.shortcuts import render
from ipware import get_client_ip
def home(request):
    if request.method=="POST":
        # ここでIPアドレスを取得する
        client_ip, is_routable = get_client_ip(request)
        # client_ipにはIPアドレスが格納される
        print(client_ip, is_routable)
    return render(request,'home.html')

ポイントは、POSTリクエストを受け取った際にget_client_ip()関数を呼び出すところです。この関数はリクエストオブジェクトを渡すだけで送信元のIPアドレスを判定してくれ、2つの戻り値を返します。

  • client_ip:クライアントのIPアドレス(文字列)
  • is_routable:取得したIPがグローバル(ルーティング可能)なアドレスかどうかを示す真偽値。プライベートIPの場合はFalseになります

プロキシやロードバランサーを経由した環境でも、適切なヘッダーを自動的に解析して実際のクライアントIPを推定してくれるため、実運用でも安心して使えます。

実行結果

ここではローカル環境(localhost)で動作させているため、出力は次のようになります。

[23/Aug/2021 13:34:55] "GET / HTTP/1.1" 200 9999
127.0.0.1 False
[23/Aug/2021 13:34:58] "POST / HTTP/1.1" 200 9999

ローカルホストのループバックアドレスである127.0.0.1が取得できており、プライベートアドレスのためis_routableFalseになっていることがわかります。本番環境では、アクセスしてきたユーザーのグローバルIPアドレスとTrueが返されます。

このようにdjango-ipwareを使えば、数行のコードでPOSTリクエストの送信元IPアドレスを取得できます。IPベースのアクセス制限やレート制限など、セキュリティ強化の第一歩としてぜひ活用してみてください。

  1. Django REST FrameworkでJWT認証を実装する方法をわかりやすく解説

    Django REST Framework(DRF)を使った開発経験がある方なら、JWT認証という言葉を一度は耳にしたことがあるでしょう。JWTは「JSON Web Token」の略称で、トークンベースの認証を実現する仕組みです。Djangoにおける認証方式として非常に人気が高く、APIのセキュリティ確保に広く活用されています。この記事では、Django REST FrameworkでJWT認証を導入し、実際に動かすまでの手順をステップごとに解説します。JWT認証とはJWT認証は、ユーザー名とパスワードを使ってトークンを発行し、以降のリクエストではそのトークンを送信することで認証を行う方式です

  2. Facebookグループの投稿に事前承認(承認リクエスト)を設定する方法

    Facebookをよく利用している方なら、Facebookグループの存在をご存じでしょう。多くの人と一度につながれる非常に便利な機能で、アイデアや計画の共有、メンバー同士でのディスカッションに最適な場となっています。グループでは、さまざまな話題について意見を交わすだけでなく、写真や動画の共有も可能で、メンバー同士のつながりを深めることができます。世界各地のユーザーが参加するグループを作成・運営している方も少なくないでしょう。あなたがそのようなグループの管理者なら、日々の管理・運営の手間を実感しているはずです。中には、メンバーが無関係な投稿や不適切なコンテンツをアップし、他のメンバーの気分を害し