И так,все наверное знают что есть разные способы получить пароль жертвы, соответственно и разные способы для этого, самый простой и распространенный это брут (перебор паролей).. сейчас напишем небольшую защиту от подобных атак..
Везде есть форма входа типа логин и пароль, после введения данных из формы они отправляются на файл обработки пусть это будет vhod.php и везде есть стандартная проверка
Если значение логина и пароля находятся в одной колонке и они равны введенным из формы то создаем сессию или куки для етого юзера (авторизируем его)
например..
if (isset($_REQUEST['user']) && isset($_REQUEST['pass']))
{
$user = mysql_real_escape_string($_REQUEST['user']);
$password = mysql_real_escape_string($_REQUEST['pass']);
$proverka = mysql_query("SELECT id FROM users WHERE nick = '$user' AND pass = '$password' LIMIT 1");
}
//если проверка правдивая, то ок
if (mysql_num_rows($proverka) == true)
{
$user = mysql_fetch_assoc($proverka);
//ставим сесси,куки т.д,создаем авторизацию
}
else
{
echo 'Неверные данные';
}
//На данном этапе нас интересует именно else, тоесть когда данные ложны..
Идея состоит в том чтобы дать юзеру всего лишь 5 попыток для свободного ввода логина и пароля,а далее выдавать еще раз формы авторизации с проверочным кодом.. вернемся к else - ошибочному варианту,
для начала создадим еще одну ячейку в табле юзера.. выполним запрос
ALTER TABLE таблица юзера ADD COLUMN vhod INT(11) default 0
//создастся ячейка vhod со значением 0
Идем больше..
При каждой неверной попытке входа,мы должны обновлять ячейку vhod, предварительно считывая ее нынешнее значение в зависимости от введенного логина..
$usi = mysql_query("SELECT vhod FROM `users` WHERE `nick` = '$_REQUEST[user]'");
while ($openus=mysql_fetch_array($usi))
{
$vhod = $openus['vhod'] + 1; //даем значение переменной, это вытащенная инфа из ячейки vhod у введенного юзера, к ней плюсуется единичка,каждый раз,когда юзер неправильно вводит данные
но уже с проверончым кодом..
{
$chislo=rand(10000,99999); //случайное число
setcookie("antibot", $chislo, time()+60*60*24*30); //ставим это число в куки
echo 'Исчерпан лимит на попытку входа! Подтвердите что вы не бот:';
//далее форма входа
echo '<form method="POST" action="antibot.php">
<input type="text" name="user" size="11" value=" Логин"/>
<input type="text" name="pass" size="6" value=" Пароль "/></br>
Анти-бот '.$chislo.' </br> <input name="anti" type="text"><br>
<input type="submit" name="antibot" value="Подтвердить"/>';
exit(); // запрещаем выполнение дальнейшего выполнения кода
}
mysql_query("UPDATE `users` SET `vhod` = '$vhod' WHERE `nick` = '$_REQUEST[user]' LIMIT 1"); //это обновление ячейки , если ее значение еще не достигло 5 - попыток входа
//чистим куки,сессии
echo 'Неправильный Логин или Пароль!';
die();
Отправляем на проверку в antibot.php предварительно создав этот файл
<?php
require 'путь к файлу подключки бд';
if (isset($_REQUEST['user']) && isset($_REQUEST['pass']) && isset($_REQUEST['antibot']))
{
$user = mysql_real_escape_string($_REQUEST['user']);
$password = mysql_real_escape_string($_REQUEST['pass']);
$proverka = mysql_query("SELECT id FROM users WHERE nick = '$user' AND pass = '$password' LIMIT 1");
}
if (mysql_num_rows($proverka) == true)
setcookie("antibot", $chislo, time()+60*60*24*30);
if ($_COOKIE['antibot'] != $_POST['anti'])
{
echo 'Не верный проверочный код!';
exit();
}
echo 'OK! Данные подтверждены! Вы не бот';
mysql_query("UPDATE `users` SET `vhod` = '0' WHERE `nick` = '$_REQUEST[us]' LIMIT 1"); //обнуляем ячейку,тем самым позволяя юзеру проводить свободную авторизацию без проверочного кода
}
else
{
echo 'Данные не подтверждены! Логин или Пароль не верны!';
}
}
Даже сложная каптча не спасёт,т.к есть сервис антигейт.. Тот метод что я написал просто усложнит задачу кодеру,при написании брута,т.к используються две формы входа,с периодическим подтверждением второй формы с пров. кодом