Php 用户应在三次登录尝试后等待几分钟

Php 用户应在三次登录尝试后等待几分钟,php,mysql,Php,Mysql,我目前有一个名为login\u count的字段,它更新用户尝试登录的次数。如何获取该数据并发出if-else语句,让用户等待几分钟后才能再次登录 function login_check(){ if($_SERVER['REQUEST_METHOD']=='POST'){ include "config.php"; $conn = mysqli_connect($host,$user,$pass,$db);

我目前有一个名为login\u count的字段,它更新用户尝试登录的次数。如何获取该数据并发出if-else语句,让用户等待几分钟后才能再次登录

function login_check(){

        if($_SERVER['REQUEST_METHOD']=='POST'){
            include "config.php";
            $conn = mysqli_connect($host,$user,$pass,$db);

            if( mysqli_connect_errno($conn) ){
                echo "Error in DB";
            }else{
                // echo "OK";
            }
            $sql="SELECT * FROM login_details
                    WHERE username='".$_POST['username']."' AND
                    password='".md5($_POST['password'])."'";

            //execute the query
            $result= mysqli_query($conn,$sql);
            //display result            

            if (mysqli_num_rows($result)>0){
                //username and password are correct

                $username= $_POST['username'];
                $_SESSION['username']= $username;

                $qry = "UPDATE login_details SET login_count = 0 WHERE username = '".$_POST['username']."'";
                $rslt = mysqli_query($conn,$qry);

                header("Location: accessnow.php?action=loggedin&username=$username");

            }
            else{
                //username and password are wrong
                // on failed login attempt:

                $query1 = "UPDATE login_details SET login_count = login_count + 1 WHERE username = '".$_POST['username']."'"; 
                $res = mysqli_query($conn,$query1);

                $query2 = "SELECT login_count WHERE username = '".$_POST['username']."'"; 
                $query2_result = mysqli_query($conn,$query2);                   

                if($query2_result >= 3) 
                    { 
                    // SHOULD SHOW AN ALERT
                    echo '<script> alert("You have 3 login attempts")</script>';
                    }                       

                echo '<script> alert("Username and Password did NOT match")</script>'; 

            }
        }
        else{
            //DISPLAY THE LOGIN FORM
        }   

 }
函数登录检查(){
如果($\u服务器['REQUEST\u METHOD']='POST'){
包括“config.php”;
$conn=mysqli_connect($host、$user、$pass、$db);
if(mysqli\u connect\u errno($conn)){
回显“数据库错误”;
}否则{
//回音“OK”;
}
$sql=“从登录详细信息中选择*
其中username='“$\u POST['username']”和
密码=”.md5($_POST['password'])。“”;
//执行查询
$result=mysqli\u查询($conn,$sql);
//显示结果
如果(mysqli_num_行($result)>0){
//用户名和密码正确
$username=$_POST['username'];
$\会话['username']=$username;
$qry=“更新登录详细信息设置登录计数=0,其中用户名=”。$\u POST['username']。“”;
$rslt=mysqli\u查询($conn,$qry);
标题(“Location:accessnow.php?action=loggedin&username=$username”);
}
否则{
//用户名和密码错误
//登录尝试失败时:
$query1=“更新登录详细信息设置登录计数=登录计数+1,其中用户名=”。$\u POST['username']。“”;
$res=mysqli_查询($conn,$query1);
$query2=“选择登录计数,其中用户名=”$\u POST['username']。””;
$query2\u result=mysqli\u查询($conn$query2);
如果($query2\u结果>=3)
{ 
//应该显示警报
回显“警报”(“您有3次登录尝试”);
}                       
echo“警报(“用户名和密码不匹配”);
}
}
否则{
//显示登录表单
}   
}

您可以创建一个表来存储来自特定IP地址的登录尝试次数。表结构可以是这样的

CREATE TABLE `LoginAttempts` 
(
`IP` VARCHAR( 20 ) NOT NULL ,
`Attempts` INT NOT NULL ,
`LastLogin` DATETIME NOT NULL 
)
授权页面应该使用两个表:一个表 存储有关注册用户的信息,另一个存储在 将列出不成功的登录尝试


在验证输入的数据之前,系统必须检查用户是否超过尝试次数限制。如果LoginAttents表中有两条以上的记录对应于一个IP地址,则会出现错误消息,说明访问被阻止了一段时间。

最好将其绑定到会话中,这样,如果某个会话尝试了三次失败,则会拒绝该会话尝试和登录的能力。一些ISP可能会在每次页面请求时向用户发布新的IP地址(我相信AOL曾经这样做过)。如果你是根据IP地址来做的,黑客可能会计算出他们被锁定了多少次,并调整他们的策略,在这么多次尝试后可能会抓取一个新的IP地址


还要注意的是,md5()生成器已经被rainbow Table死掉了,这使得它实际上毫无用处。PHP版本5.5及更新版本内置了处理密码散列的函数。

在登录尝试中添加条件,并在循环中使用
睡眠(时间以秒为单位)为分钟数添加延迟选中此项--------------------请将查询更改为使用准备好的语句。现在查询的结构允许任何人通过SQL注入进行访问,而无需密码。