Я хочу ограничить неудачные попытки входа в систему. Например, если конкретный пользователь попытается войти в систему с неправильным именем пользователя или паролем 4 раза, я должен показать CAPTCHA в 4-й раз вместо блокировки в течение определенного времени и продолжать показывать CAPTCHA, если он не поставляет действительное имя пользователя и пароль. После того, как пользователь успешно выполнил вход в систему, попытка входа в систему сбрасывается в ZERO.
Является ли идея проверки имени пользователя вместо IP-адреса ОК в точке безопасности? Можно ли реализовать этот подход без использования базы данных ?, так как мне кажется, мне не нужно хранить время, потому что я просто покажу recaptcha? Пожалуйста, дайте свое мнение.
Вы не хотите использовать базу данных для «количества неудачных попыток входа в систему»? Затем просто используйте cookie и проверьте его. Конечно, они могут удалить его, но это хлопот.
Тем не менее , я подозреваю, что вы уже получаете имя пользователя и пароль из базы данных, почему бы и не получить последнее количество неудачных логинов, пока вы на нем?
if (isset($_POST['submit_login'])) { if (isset($_POST['username']) && isset($_POST['password'])) { $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); // id = unique primary key $rs = mysql_query('SELECT id,Username,Password,Failed_logins,IP_address FROM Users WHERE Username = '.$username.''); $num = mysql_num_rows($rs); if ($num > 0) { // I would add a password hash here to $password, and check against the hashed Password from the database // But let's check the clean passwords $row = mysql_fetch_array($rs); if ($password == $row['Password']) { // Successful login, set session or whatever you need // Reset failed logins mysql_query('UPDATE Users SET Failed_logins = 0 WHERE id = '.$row['id'].''); header('location: success.php'); } else { // Failed password check if ($row['Failed_logins'] > 3) { // Redirect to captcha header('location: captcha.php'); } else { $ip = $_SERVER['REMOTE_ADDR']; if ($row['IP_address'] != $ip) { // New ip adress, reset failed logins $failed_logins = 0; } else { // Increment failed logins $failed_logins = $row['Failed_logins']+1; } mysql_query('UPDATE Users SET Failed_logins = '.$failed_logins.',IP_address = '.$ip.' WHERE id = '.$row['id'].' '); } // End check Failed_logins > 3 } } else { // No such Username found in database $error = 'no_such_username'; } // End username check from database } else { // Either username or password is missing $error = 'incomplete_form'; } // end check for username and password } // end main submit_login check
Что-то вроде того.
РЕДАКТИРОВАТЬ:
Это действительно старый код, и я вижу некоторые проблемы с ним сейчас. Но, по крайней мере, вы всегда должны использовать PDO (подготовленные инструкции) для вставки данных в вашу базу данных.
Что вы защищаете?
Случайный пользовательский контент, имя пользователя.
Банковская информация (я сомневаюсь.) Или другие конфиденциальные данные, IP может быть в порядке, если вы используете диапазоны.
Вы спрашиваете, как это сделать или что вы должны использовать?
Вам нужно время, как бы вы определили, продлилась ли попытка входа в систему? Если я не смогу войти в систему 4 раза в течение 10-летнего промежутка времени, я бы заблокирован. Вы хотите заблокировать тех, кто пытается выполнить несколько попыток входа в течение короткого промежутка времени.
Я предлагаю вам использовать базу данных, так как вы будете вести подробную историю логинов одновременно. Но решение на базе памяти, подобное memcached, также может быть достаточно.
Чтобы разработать, какую безопасность реализовать: комбинация !
Объедините используемое имя пользователя и IP-адрес и сохраните их в своей базе данных.
Вы должны сохранить попытки в базе данных и проверить пользователя.
Лучший способ сделать это – использовать базы данных.
Вам необходимо создать отдельную таблицу в вашей базе данных, в которой будут храниться три переменные:
(a) IP-адрес (где пользователь пытается войти в систему) (b) Количество попыток входа в систему (c) дата / время (или: текущая метка времени)
Единственная проблема с этим подходом заключается в первой переменной: IP-адрес
Что делать, если человек находится в интернет-кафе? Или используя общественный Wi-Fi? Или горячая точка? Или, школа? офис? и т. д.
Если вы заблокируете IP-адрес, это повлияет на всех, кто пытается войти на ваш сайт с этого места.
Это не проблема, если ваш веб-сайт касается чего-то вроде банка или военной установки или Пентагона.
Но если ваш сайт – это бизнес (покупка и продажа, игра, что угодно), то блокирование определенного адреса будет только мочиться у ваших клиентов!