Intereting Posts
PHP: можно ли переходить из одного случая в другой внутри коммутатора? Уведомление Apple Push: отправка больших объемов сообщений Добавить атрибут продукта в счет-фактуру Magento 1.9 Понимание ограничителя кеша | заголовки уже отправили php-предупреждение Библиотека PHP GD выводит изображение и текстовое содержимое на одной странице Эффективно использовать Google App Engine для отправки большого количества писем с помощью PHP? Невозможно получить доступ к константе класса из экземпляра с помощью оператора :: scope Как удалить все повторяющиеся записи в PHP / Mysql Ошибка CodeIgniter 403 Соединение между phpstorm и xdebug Функция PHP для подключения mysqli дает ошибку Соответствие для нечувствительной к регистру точной фразы с пробелами Как отправить форму входа в ASP.NET с помощью PHP / cURL? загрузка нескольких изображений в загружаемое файл Symfony вызывает сборщик мусора PHP на Ubuntu 14.04, даже если session.gc_probability установлен в 0

Ограничение количества неудачных попыток входа в систему

Я хочу ограничить неудачные попытки входа в систему. Например, если конкретный пользователь попытается войти в систему с неправильным именем пользователя или паролем 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-адрес и сохраните их в своей базе данных.

  1. Используйте попытки входа в ваше имя пользователя, чтобы защитить своих пользователей от попыток.
  2. Используйте информацию IP-адреса, чтобы наблюдать только за обнаружением, и при необходимости предпринимайте действия.

Вы должны сохранить попытки в базе данных и проверить пользователя.

Лучший способ сделать это – использовать базы данных.

Вам необходимо создать отдельную таблицу в вашей базе данных, в которой будут храниться три переменные:

(a) IP-адрес (где пользователь пытается войти в систему) (b) Количество попыток входа в систему (c) дата / время (или: текущая метка времени)

Единственная проблема с этим подходом заключается в первой переменной: IP-адрес

Что делать, если человек находится в интернет-кафе? Или используя общественный Wi-Fi? Или горячая точка? Или, школа? офис? и т. д.

Если вы заблокируете IP-адрес, это повлияет на всех, кто пытается войти на ваш сайт с этого места.

Это не проблема, если ваш веб-сайт касается чего-то вроде банка или военной установки или Пентагона.

Но если ваш сайт – это бизнес (покупка и продажа, игра, что угодно), то блокирование определенного адреса будет только мочиться у ваших клиентов!