2012-01-27 71 views
9

いくつかのログイン試行に失敗した後に、がDjangoユーザアカウントをロックするための洗練された方法を探していますログイン試行回数が多すぎるとユーザをロックする

「私は何を試しましたか?」:私はSOに同様の質問のために失敗し見ている

は(この質問がDUPである場合、これを削除するにはコメントを投稿してください)。

現在、私は他の開発者の経験を探しています。私は答えを整理しないために試したことについて話をしたくないです。

追加情報として、このアプリケーションにはUserProfileが有効になっていません(ただし、その価値がある場合は有効にできます)。

+1

は、私の意見では貧弱なデザインです。悪意のある第三者が意図的に知られている(または予想される)アカウントを突き飛ばして、実際のユーザーをロックアウトする可能性があります。 IPなどに基づくブロッキング(またはおそらくは、ヘルブロック)が好ましい。そのより高いセキュリティ、おそらく2つの組み合わせが必要な場合、IPブロックはより少ない試行回数で発生します。 –

+0

認証されていないユーザーに対してアカウントをロックしているという点はありませんか?軽度の不便は妥協したアカウントよりはるかに優れていますか? – DylanYoung

答えて

13
+0

nice、thanks Dr!しかし、これはアカウントをロックしない(私にとっては解決策ではない)。あなたは両方のいずれかを試しましたか?誰かが実際の環境で使っている経験がありますか? – danihp

+2

@danihp 'django-brutebuster'は失敗したログイン試行ごとにモデルインスタンスを作成し、そこにユーザ名を記録します。ですから、このモデルに 'post_save'シグナルを追加し、そこにユーザをロックするのはむしろエレガントだと思います(1行のコード)。私はロギングのためだけにdjango-brutebusterを試しましたが、実稼働環境では必要ありませんでした。 – DrTyrsa

+0

私に尋ねる時間を与えてください;) – danihp

7

を見てみましょう私たちはdjango-lockoutを使用し、それが一つの簡単な解決策はで初期状態0と1で毎回増加しているユーザープロファイルで変数を作成することです本当によく

+0

共有ノウハウをお寄せいただきありがとうございます。私はlockoupのdocを読んで、私は質問があります:ロックはキャッシュレベルでのみですか?ユーザーをデータベースにロックしているとマークする方法はありますか? – danihp

+0

キャッシュのみ。あなたがシステムをブルートフォースしようとしているときに、負荷を減らす(余分なDBクエリーは必要ありません) –

3

を働きましたユーザーはログインに失敗します。この変数が特定のしきい値に達すると(ユーザーがログインしようとするたびにチェックされます)、ユーザーアカウントは一時停止されます。もちろん、ユーザーが正常にログインした場合は、変数を0に戻す必要があります。

+2

このようにすれば、カップルのユーザ名でログインしようとするだけで他の人をロックアウトすることができます回。 IPとの組み合わせでのみユーザ名をロックするのは良い考えです。 – kioopi

+0

@kioopiのヒントのほかに、データベースにヒットする必要のない解決策がおそらく望ましいでしょう。 – Max

1

「ユーザー」フィールドと外部キーと「タイムスタンプ」フィールドの2つのフィールドを持つ「failed_logins」というモデルを作成します。

ユーザーが正常にログインすると、そのユーザーのすべての "failed_logins"エントリが削除されます。

ユーザーがログインに失敗した場合は、現在のタイムスタンプを持つそのユーザーの「failed_logins」にエントリを作成します。パスワードが間違っ/正しいかどうかを確認するためにチェックする前に、そのユーザのすべてのログイン試行、オン

  • は15分(またはW/Eの時間よりも古いすべての「failed_logins」のエントリを削除するクエリを実行します期間)。

  • loginしようとしているユーザーのfailed_loginsのエントリ数を確認するクエリを実行します。それが5の場合は、ログイン試行を中止し、ユーザーにアカウントからロックアウトされたことを通知し、しばらくしてから試してみてください。

結果: ユーザーは、短時間の間、5回失敗したログイン試行の後にロックアウトされます。あなたがこのスニペット試すことができ

+1

あなたのソリューションは問題を抱えています。あなたのロックはアカウントベースであるため、誰でも他のユーザーをロックアウトすることができます。さらに、不必要な多くのデータベースヒットが存在します。 – Max

-4

:失敗したログイン試行に基づく* *ユーザをロックアウト

<?php 
session_start(); 

$conn = mysql_connect("localhost","root","root"); 
$select = mysql_select_db("Gayathri",$conn) or die("connection error"); 

if(isset($_COOKIE['login'])&&$_COOKIE['login']>=3){ 
echo " you have to wait for sometimes to enable your login"."<br>"; 
} 

if(isset($_POST["username"],$_POST["userpassword"])){ 
    $username = $_POST['username']; 
    $userpassword = $_POST['userpassword']; 

    $query = "SELECT * from userlogin where username='".$username."' and userpassword='".$userpassword."'"; 
    $result = mysql_query($query); 
    $row = mysql_fetch_assoc($result); 

if($row){ 
    echo"login successfull"; 
} 
else{ 
    echo"Invalid password"."<br>"; 
if(isset($_COOKIE['login'])){ 
    $attempts=$_COOKIE['login']+1; 
     }else{ 
    $attempts=1; 
} 
setcookie('login', $attempts, time()+60*60); 
} 

} 
?> 
<form method = "post" action = ""> 
<table border=1> 
<tr> 
    <td>Username:</td> 

    <td><input type="text" name="username" value=""></td> 
</tr> 
<tr> 
    <td>Userpassword:</td> 

    <td><input type="password" name="userpassword" value=""></td> 
</tr> 
<tr> 
    <td colspan="2" align=center><input type="submit" name="submit" value="login"></td> 
</tr> 
</table> 
+1

警告:mysql_ *関数はサポートされなくなりました(https://stackoverflow.com/questions/12859942)。それらは[PHP 5.5.0で廃止されました](https://wiki.php.net/rfc/mysql_deprecation)および[PHP 7.0.0で削除されました](https://php.net/manual/en/function.mysql -connect.php#function.mysql-connect-refsynopsisdiv)。 [MySQLi](https://php.net/manual/en/book.mysqli.php)または[PDO_MySQL](https://php.net/manual/en/ref.pdo)に移行することを強くお勧めします。 -mysql.php)。 – Pang

+1

警告:あなたのコードは[SQLインジェクション攻撃](https://en.wikipedia.org/wiki/SQL_injection)に脆弱です。それを防ぐ方法の詳細については、[この記事](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php)をお読みください。 – Pang

関連する問題