повторяющиеся записи при регистрации числа неудачных попыток входа в систему mysql / php

0

У меня есть это, чтобы регистрировать количество неудачных попыток входа в систему из разных IP-адресов. Наверное, излишне сложно.

mysql db настроено:

 CREATE TABLE login_attempts (
  id int(20) NOT NULL auto_increment,
  ip varchar(20) NOT NULL default '',
  `time` datetime NOT NULL default '0000-00-00 00:00:00',
  nr char(4) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=MyISAM
# -------

обнаружение неудачных попыток входа в систему:

function ip()
{
if (!empty($_SERVER['HTTP_CLIENT_IP']))
    {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } 
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
    {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    }
    else
    {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;            
}   

$ip = ip(); 
$query = "SELECT `nr` from `login_attempts` WHERE `ip`='".$ip."' ";
$result = $conn->query($query);         
$user = $result->fetch_assoc();     
$failed_attempts = $user["nr"]; 

(... некоторый код...)

Если сбой входа:

    if( $failed_attempts == 0 ){

                $query = "INSERT INTO login_attempts (`ip`, `time`, `nr`) VALUES ('".$ip."', '".$time."', '1')";
                $result = $conn->query($query);             
                if (!$result){ trigger_error("mysql error: ".mysql_errno($result) . ": " . mysql_error($result)); return 0;  }

            } else {

                $query = "UPDATE login_attempts SET ip = '".$ip."', time = '".$time."', nr = nr + 1 "; 
                $result = $conn->query($query);             
                if (!$result){ trigger_error("mysql error: ".mysql_errno($result) . ": " . mysql_error($result)); return 0;  }

            } 

Это как-то дает повторяющиеся записи в моем db. Тот же ip, другой nr.. Почему?

Теги:
security
logging

2 ответа

0
Лучший ответ

В вашем запросе UPDATE нет предложения WHERE, поэтому он обновляет каждую строку таблицы, устанавливая столбцы ip и time во всех строках для этих значений.

$query = "UPDATE login_attempts SET time = CURRENT_TIMESTAMP, nr = nr + 1 WHERE ip = '$ip'";
0

Вы должны добавить условие WHERE ко второму SQL-запросу. В противном случае он обновит все строки в таблице.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню