nginx プロキシの背後で Django サーバーを実行しています。現在、を読んでリモートアドレスを特定しようとしていますrequest.META['REMOTE_ADDR']
。より正確には、ユーザーのパスワードをブルート フォースしようとする試みをレート制限するアプリ (Django-brutebuster) がこれを行っています。
Django は nginx の背後にあるため、REMOTE_ADDR
は Nginx のアドレス (127.0.0.1) であるため、あまり役に立ちません。また、ブルートバスターの観点からは全員が同じ IP にいるため、意図的にパスワードを誤って推測することで、アプリケーションを DOS に開放します。
このフォーラムで同様の質問を見つけました。
- Django get IP は 127.0.0.1 のみを返します
- REMOTE_ADDR が nginx と tornado を使用して Django に送信されない
- リモート IP をプロキシされたサービスに渡す方法は? - ニンクス
パズルのピースは上記で見つけることができると思います。しかし、それらはまた、新しい攻撃ベクトルへの適用を可能にするものでもあると思います。具体的には、何らかの理由で Django が nginx の背後で実行されていない場合、X-something ヘッダーを自動的にチェックすると、クライアントからこれらのスプーフィングが開かれます。
上記の質問と回答のいずれにも、「これを行うための正しい唯一の方法」(TM) への言及がないように見えることは、私にとっては少し驚くべきことです。Django には、この問題に対する標準的な解決策がありませんか? それがなければ、少なくともセキュリティ上の問題を引き起こさない解決策を思いつくことができるでしょうか?