【问题标题】:when I use "modify" on my timestamp it gives a wrong output当我在时间戳上使用“修改”时,它会给出错误的输出
【发布时间】:2017-09-08 07:37:42
【问题描述】:

我想阻止一个尝试使用错误密码登录 4 次的人。

问题是:当我使用“修改”并将时间戳更改为 15 分钟时,我得到 -1 作为输出,两分钟后我得到 -2 作为输出。我绑了这么久,我在互联网上搜索了很多,但它仍然不起作用。

我希望它如何工作:
在数据库中有列:“falselog”。如果访问者的用户名正确但密码错误,则 falselog 将为 +1。当 falselog 为 4 时,访问者将被禁止 15 分钟。因此访问者可以尝试 4 次。 15分钟后,访客可以再试一次。

这是我的所有代码对象:

public function logUser($username, $password) { 

    // query id = 2     
    $sql2_1 = "SELECT 
            id, 
            password, 
            falselog, 
            lastlogin
        FROM users
        WHERE username ='".$username."' ";

    $result2_1 = $this->con->query($sql2_1);
    $fetch2_1  = mysqli_fetch_array($result2_1);
    $count2_1  = $result2_1->num_rows; 

    $now          = new DateTime('now');    
    $blockedSince = new DateTime($fetch2_1['lastlogin']);

    $fout     = $fetch2_1['falselog'];
    $date_old = date ("Y-m-d H:i:s", strtotime("now")); 

    $block    = date("i", $fetch2_1['lastlogin']) + 16;         
    $current  = date("i", strtotime("now"));
    $wait     = $block - $current ; 
    $dbtime   = date ("Y-m-d H:i:s", strtotime($date_old));


    // This is the code that doesn't work
    if ($fetch2_1['falselog']>=4 AND $blockedSince->modify('+15 minutes') > $now) {
        $error[] = 'This account has been banned, try again about '.$wait.' minutes';
        $decline = true;  
        $date_old = $fetch2_1['lastlogin']; 
    } 

    elseif (!preg_match("/^[A-Za-z0-9-]+$/", $username)) { 
        $error[] = 'De input bevat ongeldige tekens (alleen cijfers en letters toegestaan)';
    } 

    elseif ($count2_1 === 0) {
        $error[] = 'Wrong login data';
    } 

    elseif ($fetch2_1['password']!=sha1($password)) {
        $error[] = 'wrong password';
        $fout = $fetch2_1['falselog']+1;
    } 

    if ((count($error) == 0) OR ($fetch2_1['falselog']==4 AND $blockedSince->modify('+15 minutes') < $now)) {
        $fout = 0; 
    }

    $sql2_2 = "UPDATE users SET 
            falselog='".$fout."', 
            lastlogin='".$dbtime."'
        WHERE username='".$username."' ";

    if ($this->con->query($sql2_2) === TRUE) {

        if (count($error) == 0) {
            return false; 
        } 

        else {
            return $error; 
        }
    } 

    else {
        echo "Error: " . $sql2_2 . "<br>" . $this->con->error;
        return true; 
    }
} 

【问题讨论】:

  • “我正在努力使我的网站登录安全” - WHERE username ='".$username."' - sha1($password) - 也许你应该先修复基础知识。
  • 你能给我解释一下吗?

标签: php mysql oop


【解决方案1】:

你应该在这里检查

$blockedSince = new DateTime($fetch2_1['lastlogin']);

你得到了正确的 DateTime 数据,试试 var_dump($blockedSince);在这一行之后,检查它里面的值是否正确;

【讨论】:

  • 它工作正常,谢谢!只有这个:“这个帐户已被暂停,再试一次大约-50分钟”这是错误的输出。时间来自“$wait”。我现在会尝试自己修复它! :)
【解决方案2】:

试试这个 $blockedSince = mktime($fetch2_1['lastlogin']);

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 2014-08-21
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多