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_routableはFalseになっていることがわかります。本番環境では、アクセスしてきたユーザーのグローバルIPアドレスとTrueが返されます。
このようにdjango-ipwareを使えば、数行のコードでPOSTリクエストの送信元IPアドレスを取得できます。IPベースのアクセス制限やレート制限など、セキュリティ強化の第一歩としてぜひ活用してみてください。
-
Django REST FrameworkでJWT認証を実装する方法をわかりやすく解説
Django REST Framework(DRF)を使った開発経験がある方なら、JWT認証という言葉を一度は耳にしたことがあるでしょう。JWTは「JSON Web Token」の略称で、トークンベースの認証を実現する仕組みです。Djangoにおける認証方式として非常に人気が高く、APIのセキュリティ確保に広く活用されています。この記事では、Django REST FrameworkでJWT認証を導入し、実際に動かすまでの手順をステップごとに解説します。JWT認証とはJWT認証は、ユーザー名とパスワードを使ってトークンを発行し、以降のリクエストではそのトークンを送信することで認証を行う方式です
-
Facebookグループの投稿に事前承認(承認リクエスト)を設定する方法
Facebookをよく利用している方なら、Facebookグループの存在をご存じでしょう。多くの人と一度につながれる非常に便利な機能で、アイデアや計画の共有、メンバー同士でのディスカッションに最適な場となっています。グループでは、さまざまな話題について意見を交わすだけでなく、写真や動画の共有も可能で、メンバー同士のつながりを深めることができます。世界各地のユーザーが参加するグループを作成・運営している方も少なくないでしょう。あなたがそのようなグループの管理者なら、日々の管理・運営の手間を実感しているはずです。中には、メンバーが無関係な投稿や不適切なコンテンツをアップし、他のメンバーの気分を害し