0

我有一个基本的登录页面。该页面将用于记录登录失败的用户名和 unix 时间。

是否可以在允许用户输入密码之前查看用户名,如果尝试次数为 5 次或以上,则可以将其禁用 30 分钟。

我已经在网上搜索过,但找不到任何东西,另一个解决方案是在允许代码继续之前查看表格,但再次有一点大脑冻结,确定它很容易,但更愿意阻止用户早点?

我附上了检查页面,以便您可以看到我正在尝试的内容。

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. 我建议使用密钥和盐来加密您的密码(使用 sha256+),因为md5它非常弱。密钥将存储在您的数据库中,盐存储在服务器上。

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

  3. 使用准备好的语句和绑定参数来防止任何级别的 SQL 注入。

回答你的问题;是的,可以检查用户对用户名的尝试。你走在正确的道路上。

于 2013-03-09T17:47:45.803 回答
0

最简单的方法是简单地将错误尝试插入带有时间戳的表中。然后检查这是否高于三个:SELECT COUNT(*) FROM error_table WHERE error_time < 1800 AND user_id = $user_id。(或用户名,或其他)。这样您就不必跟踪失败尝试的次数,它们很容易从COUNT语句中获得。如果您想要更多详细的方法,那么有一个禁用的时间戳,一旦计数 >= 3 就会触发。

正如一些注释:

  1. 你不需要stripslashes
  2. 如果您完全关心用户的密码,请使用比 MD5 更复杂的密码,理想情况下您应该有某种形式的盐字符​​串。
  3. 您正在选择您的数据库,mysqli并且您正在使用mysql. 你不是故意这样做的,即使它正在工作(例如,如果你选择了 conn.php 中的数据库),这个代码也是一个 bug 的邀请。
  4. include是小写的。严格来说并不重要,但是将一个应该是小写的函数大写是失礼的。
于 2013-03-09T17:49:46.237 回答