0

基本的なログインページがあります。このページは、ログインに失敗したユーザー名とUNIX時間を記録するために使用されます。

ユーザーにパスワードの入力を許可する前にユーザー名を確認し、5回以上試行して30分間無効にすることは可能ですか?

Webを検索しましたが、何も見つかりません。他の解決策は、コードを続行する前にテーブルを確認することでしたが、少し頭がおかしくなりました。十分に簡単であると確信していますが、ユーザーを停止することをお勧めします。ついさっき?

私が何をしようとしているのかがわかるように、チェックページを添付しました。

Include("include/conn.php");
if(! $conn )
{
    die('Could not connect: ' . mysql_error());
}
mysqli_select_db('DATABASE');
// username and password sent from form
$myusername=$_POST['myusername'];
$mypassword=$_POST['mypassword'];
// To protect MySQL injection
$myusername = stripslashes($myusername);
$mypassword = stripslashes($mypassword);
$myusername = mysql_real_escape_string($myusername);
$mypassword = mysql_real_escape_string($mypassword);
// encrypt password
$encrypted_mypassword=md5($mypassword);
//see if account is locked
//STUCK HERE if looking at amount of attements before allowing code to run. 
//look up username and pasword match
$sqli="SELECT * FROM TABLE WHERE Username='$myusername' and     Password='$encrypted_mypassword'";
$result=mysql_query($sqli);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
    // Register $myusername, $Unique_Id and redirect to file "home.php"
    session_register("myusername");
    session_register("Unique_Id");
    header("location:home.php");
}
//if log in if not sucsesfull
else {
    echo "Wrong Username or Password";
    //update attempt log with attempt +1 and unix time
    $sql_query_update = "UPDATE TABLE SET
        Attempts = Attempts+1,time =  UNIX_TIMESTAMP(now())
        WHERE TABLE.Username ='$myusername'";
    mysql_query( $sql_query_update );
    //close mysql
    mysql_Close();
}
?>

私は古いコードを知っていますが、これはmysqli仮想サーバーでの構成に苦労しているため、テスト専用です。

4

2 に答える 2

3
  1. あなたはミキシングmysql_mysqli_機能をしています。これらは異なるAPIであるため、これは機能しません。

  2. md5非常に弱いので、キーとソルトを使用してパスワードを暗号化することをお勧めします(sha256 +を使用) 。キーはデータベースに保存され、ソルトはサーバーに保存されます。

    hash('sha256', $keyFromDb . $saltFromServer . $userPassword);

  3. プリペアドステートメントとバインドされたパラメータを使用して、あらゆるレベルのSQLインジェクションを防止します。

あなたの質問に答えるために; はい、ユーザーによるユーザー名の試行を確認することは可能です。あなたは正しい道を進んでいます。

于 2013-03-09T17:47:45.803 に答える
0

最も簡単な方法は、タイムスタンプを使用して不正な試行をテーブルに挿入することです。次に、これが3を超えているかどうかを確認しますSELECT COUNT(*) FROM error_table WHERE error_time < 1800 AND user_id = $user_id。(またはユーザー名など)。このように、失敗した試行の数を追跡する必要はありません。それらはCOUNTステートメントからすぐに利用できます。もう少し詳細な方法が必要な場合は、カウントが3以上になるとトリガーされるタイムスタンプを無効にします。

いくつかのメモとして:

  1. ストリップスラッシュは必要ありません
  2. ユーザーのパスワードをまったく気にしない場合は、MD5よりも複雑なものを使用してください。理想的には、何らかの形式のソルト文字列が必要です。
  3. でデータベースをmysqli選択し、で選択と更新を実行していますmysql。それを行うつもりはありません。それが機能している場合でも(たとえば、conn.phpでデータベースを選択している場合)、このコードはバグへの誘いです。
  4. include小文字です。厳密には問題ではありませんが、小文字になっているはずの関数を大文字にするのは偽物です。
于 2013-03-09T17:49:46.237 に答える