説明
Djangoのログイン処理で、失敗回数の制限、遅延、ロックなどの対策を設けずにauthenticateとloginだけを呼び出すと、攻撃者がパスワードの試行を繰り返せます。
想定される影響
- 総当たり攻撃によってアカウントのパスワードを推測される可能性があります。
- 認証失敗の検知や遮断が難しくなる可能性があります。
対処方法
- アカウント、IPアドレス、デバイスごとにログイン失敗回数を追跡してください。
django-ratelimitやdjango-axesなど、検証された防御層を適用してください。
例
ログイン関数内の抜粋です。check_login_attemptsはアプリケーションで実装するか、検証された防御層に接続する必要があります。呼び出しを追加するだけでは制限は機能しません。認証失敗を記録し、次の試行を許可するかどうかの判断に反映してください。
変更前
python
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
変更後
python
if not check_login_attempts(request):
return None
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
説明:
- 変更前: 失敗回数の制限、遅延、ロック、CAPTCHAなどを設けずに
authenticateとloginを呼び出すため、パスワードの試行を繰り返せます。 - 変更後: アカウント、IPアドレス、デバイスごとに失敗回数を追跡し、しきい値を超えたら遅延やロックを適用します。