DjangoのCsrfMiddlewareの注意点

DocumentのHow it worksに記載されていますが、Djangoの「django.middleware.csrf.CsrfMiddleware」はGETの場合はチェックをしていません。これは当然と言えば当然ですが、もしPOSTで送ったパラメータを「django.http.HttpRequest.REQUEST」を使って取得している場合は注意する必要があります。なぜならば、同辞書型の変数はまずはPOSTで送ったデータを見て、次にGETで送ったデータを参照するからです。そうすると、CSRFのチェックは回避しつつ、POSTで渡すデータと同じデータを渡せることになってしまいます。

これを防ぐには、「django.http.HttpRequest.POST」を使って実装することです。そうすれば、GETで送られたパラメータは取得できず、(実装されるであろう)パラメータチェックに正しく引っかかることになります。

例) Getでパラメータを送信する

http://<DOMAIN>?hoge=HOGE

def index(request):
    request.GET.get("hoge")  # Return HOGE.
    request.POST.get("hoge")  # Return None.
    request.REQUEST.get("hoge")  # Return HOGE.

例) Postでパラメータを送信する



def index(request):
    request.GET.get("hoge")  # Return None.
    request.POST.get("hoge")  # Return HOGE.
    request.REQUEST.get("hoge")  # Return HOGE.

この記事が役に立った場合、シェアしていただけると励みになります!!