[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Защита от подбора паролей по ip
r2ndom
По совету разделил по блокам проверил все условия:
Заносим введенные пользователем логин и пароль в переменные $login, если он пустой, то уничтожаем переменные:

if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} } //
if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }

Если пользователь не ввел логин или пароль, то выдаем ошибку и останавливаем скрипт

if (empty($login) or empty($password))
{
exit ("Вы ввели не всю информацию, вернитесь назад и заполните все поля!");
}

Экранируем вводимые данные

$login = stripslashes($login);
$login = htmlspecialchars($login);
$password = stripslashes($password);
$password = htmlspecialchars($password);
$login = trim($login);
$password = trim($password);

Подключаюсь к базе, извлекаем ip, удаляем ip адреса тех кто ошибался позже 600сек

include ("config/bd.php");
mysql_query ("DELETE FROM oshibka WHERE UNIX_TIMESTAMP() - UNIX_TIMESTAMP(date) > 600");

Получаем количество неудачных попыток с данным ip, если их больше 4-х выводим сообщение

$result = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
$myrow = mysql_fetch_array($result);

if ($myrow['col'] > 4) {

exit("<br><h2><big><center>Вы набрали логин или пароль неверно 5 раз. Подождите 10 минут до следующей попытки.</center><big><h2>");
}

Получаем данные о введенном пользователе

$password =base64_encode(hash('whirlpool', $password, true) );
$result = mysql_query("SELECT * FROM accounts WHERE login='$login'",$db);
$myrow = mysql_fetch_array($result);

если пользователя с введенным логином и паролем не существует,то записываем ip пользователя с временем ошибки

if (empty($myrow['password']))
{
$select = mysql_query ("SELECT ip FROM oshibka WHERE ip='$ip'");
$tmp = mysql_fetch_row ($select);

Если пользователь уже есть в таблице, то приплюсовываем количество не правильного ввода. Вот эта часть судя по всему работает не верно.

if ($ip == $tmp[0]) {
$result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'",$db);
$myrow52 = mysql_fetch_array($result52);
$col = $myrow52[0] + 1;
mysql_query ("UPDATE oshibka SET col=$col, date=NOW() WHERE ip='$ip'");
}

Если пользователь ошибся и его еще нет в таблице, то добавляем

else {
mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'1')");
}
exit ("Извините, введённый вами логин или пароль неверный. Доступно всего 5 попыток.");
}

если пароли совпадают, то запускаем пользователю сессию! Дальше все работает нормально
else {....

Ошибок нет, проблема - вместо добавления +1 в столбик col к ip который уже ошибался, создается новая запись с таким же ip.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.