我想阻止一个尝试使用错误密码登录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;
}
}
答案 0 :(得分:1)
你应该检查一下
$blockedSince = new DateTime($fetch2_1['lastlogin']);
你得到DateTime的正确数据,试试var_dump($ blockedSince);在这一行之后,检查它内部是否有正确的值;
答案 1 :(得分:0)
试试这个 $ blockedSince = mktime($ fetch2_1 [&#39; lastlogin&#39;]);