Djangoログイン試行の制限不足

Djangoログイン試行の制限不足

説明

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アドレス、デバイスごとに失敗回数を追跡し、しきい値を超えたら遅延やロックを適用します。

参考資料