【问题标题】:Blocked the user after 3 attempts in PHP?在 PHP 中尝试 3 次后阻止用户?
【发布时间】:2015-08-26 12:54:02
【问题描述】:

如何在 3 次登录尝试后阻止用户并将其存储到数据库?我已经在用户表中添加了两列,一列用于登录尝试次数,第二列用于上次登录的日期时间。请帮助我,如何做到这一点。我不擅长 PHP。

谢谢

这是我的 login.php

session_start();
$ipaddress = '';
if (getenv('HTTP_CLIENT_IP'))
    $ipaddress = getenv('HTTP_CLIENT_IP');
else if(getenv('HTTP_X_FORWARDED_FOR'))
    $ipaddress = getenv('HTTP_X_FORWARDED_FOR');
else if(getenv('HTTP_X_FORWARDED'))
    $ipaddress = getenv('HTTP_X_FORWARDED');
else if(getenv('HTTP_FORWARDED_FOR'))
    $ipaddress = getenv('HTTP_FORWARDED_FOR');
else if(getenv('HTTP_FORWARDED'))
    $ipaddress = getenv('HTTP_FORWARDED');
else if(getenv('REMOTE_ADDR'))
    $ipaddress = getenv('REMOTE_ADDR');
else
    $ipaddress = 'UNKNOWN';

$loginDate = date("Y-m-d H:i:s");
$Error ="";
$successMessage ="";
if (isset($_POST['submit'])){
if ( !( $_POST['cnumber'] == "" && $_POST['password'] == "")){
    $cnumber=$_POST['cnumber'];
    $password= sha1($_POST['password']);
    $cnumber = filter_var($cnumber, FILTER_SANITIZE_NUMBER_INT);

if (filter_var($cnumber, FILTER_VALIDATE_INT)){
$con=mysqli_connect("localhost","root","","users");

$result = mysqli_query($con, "SELECT * FROM users WHERE contractNumber='$cnumber' AND password='$password'");
$data = mysqli_num_rows($result);

if($data==1){
    $_SESSION['login_user']=$cnumber;
    mysqli_query($con, "INSERT INTO `users`.`logs`(`contractNumber`, `lastLogin`, `ipAddress`) VALUES ('$cnumber', '$loginDate', '$ipaddress')");
    header('Location: profile.php');
} else {
    $Error ="Invalid Contract Number or Password.";
    mysqli_query($con, "UPDATE users SET loginAttempt = loginAttempt + 1 WHERE contractNumber = '$cnumber' ");
    print_r(mysqli_affected_rows($con));
} 
    mysqli_close($con);
} else {
    $Error ="Invalid Contract Number.";
 }
} else {
    $Error ="Contract Number or Password is Empty.";
}
}

【问题讨论】:

  • 存储会话中的登录尝试次数。传递该值后,不再显示登录表单...替代/另外,一旦会话超过限制,请取消验证他们在数据库中的帐户并要求他们联系管理员进行访问。
  • @chris85 怎么做?我不擅长 php。你能帮我解决这个问题吗?
  • 不要在会话中存储尝试次数。然后机器人可以忽略会话 cookie 并继续尝试而不会被阻止。通过 IP 地址或联系电话将失败的登录尝试存储在数据库中(取决于您是否要锁定帐户或 IP 地址)。
  • @drew010 我不知道该怎么做。你能帮助我吗?请
  • @drew010 的想法是更好的选择。这是一个较旧的线程,webcheatsheet.com/php/blocking_system_access.php。不要使用他们正在使用的mysql_ 函数,继续使用您的mysqli_

标签: php login login-script login-attempts


【解决方案1】:

可以在此线程中找到类似的问答: Increment a database field by 1

登录尝试实际上应该与用户表分开存储。您可以通过存储客户端的尝试次数(将尝试次数放入 cookie)或通过存储尝试登录的用户的 IP 和服务器端的尝试次数(在您的 sql 数据库中)来阻止登录尝试;增加每次失败登录的尝试次数。 cookie 方法的缺点是容易被攻击者规避。 IP 地址方法更难以规避,但有一个缺点是会阻止共享同一 IP 的人。我会使用这两种方法。应用规则,例如 cookie 尝试 3 次,IP 地址/尝试表尝试 15 次。

IP address variable: $_SERVER["REMOTE_ADDR"];
Getting cookies: $_COOKIE["cookie_name"];
Setting cookies: setcookie("cookie_name", "value", time()+$seconds);

cookie方法的基本实现:

// before login attempt:
$attempt_count = intval(@$_COOKIE["login_count"]); 
if($attempt_count > 3){
   die("Too many attempts");
}

_

// on failed login attempt:
setcookie("login_count", $login_count+1, time()+600);
// cookie set to expire at (now+600 seconds); 10 minutes

http://php.net/manual/en/function.setcookie.php

【讨论】:

    【解决方案2】:

    首先,当用户尝试使用错误密码时,您必须将登录尝试字段增加一个。然后检查登录尝试计数是否等于 3。如果是 3 则表示通过更改用户状态来阻止用户

        $result = mysqli_query($con, "SELECT * FROM Users WHERE contractNumber='$cnumber' AND password='$password'");
        $data = mysqli_num_rows($result);
        if($data==1)
        {
              $_SESSION['login_user']=$cnumber; // Initializing Session
              header('Location: profile.php');
        } 
        else
        {
              mysqli_query($con, "UPDATE tablename login_attempts = login_attempts+1 WHERE contarct_number = ". $cnumber");
              /*Select query login attempts and check the count*/
    
    
        }
    

    【讨论】:

    【解决方案3】:

    不要使用 cookie,因为黑客仍然可以禁用 cookie 并继续暴力攻击。请改用您的数据库。对于每次失败的尝试,将其连同时间戳一起记录到表中。然后在每个请求上,使用用户 ID 和时间戳进行查询,然后获取计数。那应该给你尝试的次数。

    【讨论】:

      猜你喜欢
      • 2015-09-07
      • 2017-03-16
      • 2016-08-23
      • 2013-09-26
      • 2015-05-09
      • 2014-04-23
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多