Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Закрытие доступа на 15 минут
Форумы портала PHP.SU » PHP » Программирование на PHP » Закрытие доступа на 15 минут

Страниц (2): [1] 2 »
 

1. vanicon - 27 Апреля, 2010 - 20:35:45 - перейти к сообщению
В таблице users хранится информация о пользователе то есть его логин, пароль и его id
В таблице oshibka хранится информация о пользователе который не правильно ввел пароль и логин три раза, то есть в поле col содержится сколько раз ошибся пользователя, в поле date храниться дата, в поле ip храниться ip пользователя
Есть авторизация на сайте:
Форма авторизации:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. <form action="index.php" id="form" method="post">
  4.   <p>
  5. <label class="mask-form">Имя пользователя</label><br>
  6. <input name="login"  type="text" class="form-input" maxlength="15">
  7. <label class="mask-form">Пароль</label><br>
  8. <input name="password" class="form-input" type="password" maxlength="15" value="">
  9. </form>
  10.  



Скрипт indexphp:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. if (isset($_POST['login'])) { $login = $_POST['login']; if ($login == '') { unset($login);} }
  4. if (isset($_POST['password'])) { $password=$_POST['password']; if ($password =='') { unset($password);} }
  5.  
  6. $ip=getenv("HTTP_X_FORWARDED_FOR");
  7. if (empty($ip) || $ip=='unknown') { $ip=getenv("REMOTE_ADDR"); }
  8.  
  9. $login = stripslashes($login);
  10. $login = htmlspecialchars($login);
  11. $password = stripslashes($password);
  12. $password = htmlspecialchars($password);
  13. //удаляем лишние пробелы
  14. $login = trim($login);
  15. $password = trim($password);
  16. $password = md5($password);//шифруем пароль
  17. $password = strrev($password);// для надежности добавим реверс
  18. $password = $password."b3p6f";
  19.  
  20. $link = mysql_connect("localhost", "root", "")
  21. or die("Ошибка подключения : " . mysql_error());
  22. mysql_select_db("simple") or die("БД не выбрана");
  23.  
  24. $result = mysql_query("SELECT * FROM users WHERE login='$login' AND password='$password'");
  25. $myrow = mysql_fetch_array($result);
  26.  
  27. if ($_POST['submit']) {
  28. if ($myrow['login'] == $login && $myrow['password'] == $password) {  
  29.      $_SESSION['password']=$myrow['password'];
  30.      $_SESSION['login']=$myrow['login'];
  31.      $_SESSION['id']=$myrow['id'];  
  32. echo "<script>
  33. location.href='admin.php'
  34. </script>";}
  35.  
  36. else {
  37. echo "Извените но вы не зашли";
  38. $resultip = mysql_query("SELECT ip FROM oshibka");
  39. $myrowip= mysql_fetch_array($resultip);
  40.  
  41. if ($ip <> $myrowip['ip']){
  42. mysql_query ("INSERT INTO oshibka (ip,date,col) VALUES ('$ip',NOW(),'0')");
  43. }
  44. $result52 = mysql_query("SELECT col FROM oshibka WHERE ip='$ip'");
  45. $myrow52 = mysql_fetch_array($result52);
  46.  
  47. $col = $myrow52['col'] + 1;//Если есть,то приплюсовываем количесво
  48. mysql_query ("UPDATE oshibka SET col=$col WHERE ip='$ip'");
  49. }
  50. }
  51.  
  52. //Если пользователь пароль и логин ввел 3 раза  не правильно
  53.  
  54. if ($col > 2) {
  55. echo "Вы набрали логин или пароль неверно 3 раза";
  56. if ($_POST['submit']) {
  57. if ($myrow['login'] == $login && $myrow['password'] == $password) {
  58.    
  59.      $_SESSION['password']=$myrow['password'];
  60.                   $_SESSION['login']=$myrow['login'];
  61.      $_SESSION['id']=$myrow['id'];
  62.          
  63. mysql_query ("DELETE oshibka WHERE ip='$ip'");  
  64. }
  65.  
  66. else {
  67. echo "Извените но вы не зашли код не верный";
  68. }
  69. }
  70. }
  71. ?>
  72.  

И нужно чтобы вместо echo "Вы набрали логин или пароль неверно 3 раза"; закрывался доступ на 15 минут, помогите разобраться
2. ZeiZ - 27 Апреля, 2010 - 21:12:52 - перейти к сообщению
Немного поменял логику и структуру таблицы oshibka:

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM users WHERE login='$login' AND password='$password'

Ищем пару и если есть, то переходим в состояние ВОШЕЛ и удаляем все неудачные записи входа из лога:
CODE (SQL):
скопировать код в буфер обмена
  1. DELETE FROM oshibka WHERE ip = $IP



Если нет, записываем ошибку в лог:
CODE (SQL):
скопировать код в буфер обмена
  1. INSERT INTO oshibka (id, ip,date) VALUES ('','$ip',".time().")

вместо NOW() я бы использовал функцию PHP - time();
вместо col - id (PK AI)

Проверяем можно ли выводить форму входа (смотри ниже):
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(id) AS col, date FROM oshibka WHERE ip = $ip DESC LIMIT1

Если col >= 3 значит 3 раза подряд ввели неправильно,
Проверяем не закончился ли наши 15минут: date <= time()-900;
Если нет, то закрываем доступ

примерно так,
З.Ы. последний абзац должен идти в самом начале кода, я написал, чтоб это можно было понять логичнее.
3. vanicon - 28 Апреля, 2010 - 05:56:53 - перейти к сообщению
У меня уже есть вывод "Вы набрали логин или пароль неверно 3 раза" если пароль и логин не совпадают, мне просто вместо этого вывода нужно закрыть соединение на несколько минут и все. Или у меня что то не так в коде?
4. ZeiZ - 28 Апреля, 2010 - 06:49:54 - перейти к сообщению
Если Вы хотите закрыть форму авторизации на 15 минут, то как минимум перед выводом формы надо сделать условие выводить её или нет.

Так например, если пользователь 3 раза ввел неверно && с последнего ввода прошло меньше 900секунд, то сообщение о том, что форма заблокирована, попробовать через некоторое время, иначе выводим форму.

Для этого в базе должна быть таблица-лог со всеми входами в систему. Я бы вообще сделал лог типа: (id, ip, time, ok) где ок - 1 - вошел, 0 - неполучилось.

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

Используйте капчу, будет проще. Потом можно и на капчу блок поставить, если совсем параноя будет =).
5. JustUserR - 28 Апреля, 2010 - 09:26:39 - перейти к сообщению
vanicon пишет:
Мне просто вместо этого вывода нужно закрыть соединение на несколько минут и все
Работа PHP-скриптов организована таким образом что соединение от пользователя принимается в любом случае - при этом сначала происходит загрузка GET/POST и только потом уже выполнение вашего PHP-скрипта - поэтому вы должны име в виду что даже если вы заблокируете какой-то IP-адрес то он может продолжать спокойно слать запросы вашему PHP-скрипту (При этом максимальная длина запроса ограничена только в настройках php.ini или самого Apache)
ZeiZ пишет:
Для этого в базе должна быть таблица-лог со всеми входами в систему. Я бы вообще сделал лог типа: (id, ip, time, ok) где ок - 1 - вошел, 0 - неполучилось.
Индентифицировать пользователя по IP не есть хорошо. IP - часто динамический, его можно подделать\изменить + блокировкой IP можно заблокировать сотню порядочных пользователей.
Это верно посколько здесь надо держаться золотой середины - с одной стороны нельзя блокировать IP а с другой вход на определенный аккаунт (А вдруг кто-то будет специально вводить неверные пароли другому пользователю чтобы тот не вошел Улыбка - поэтому надо держать в БД входов и IP-адрес и логин Плюс если на логин пользователья было множество неудачных попыток войти - то отправить ему письмо с предложением сменить пароль (Пока его не смогли подобрать)
6. vanicon - 28 Апреля, 2010 - 14:52:10 - перейти к сообщению
Блокировать не по ip а по id, а id чему будет ровняться или у него будет auto_increment. А если вместо блокировки пользователя выводить ему капчу, то есть если пользователь ошибся 3 раза появляется капча, или это не сможет защитить от подбора паролей.
7. JustUserR - 29 Апреля, 2010 - 13:28:59 - перейти к сообщению
vanicon пишет:
Блокировать не по ip а по id, а id чему будет ровняться или у него будет auto_increment
Блокировать по чистому IP тоже нельзя - ведь злоумышленник может легко написать робота который будет анализировать список пользователей на сайте - и для каждого из них автоматически рассылвать неверные авторазиционные запросы - и таким образом получится что он создаст эффект Dos-атаки за счет того что все пользователи окажутся заблокированными
Поэтому лучше использовать гибридную блокировку - по ID и по IP в разумном соотношении и на разумное время - и также высылать уведомительное письмо пользователю которго хотели взломать чтобы он мог сменить пароль
Что касается auto_increment то он работает только для KEY PRIMARY ID - иначе используйте собственный триггер для обработки увеличения значения
8. vanicon - 29 Апреля, 2010 - 14:06:47 - перейти к сообщению
JustUserR пишет:
Поэтому лучше использовать гибридную блокировку - по ID и по IP в разумном соотношении и на разумное время - и также высылать уведомительное письмо пользователю которго хотели взломать чтобы он мог сменить пароль

То есть если пользователь не ввел пароль три раза, заносятся данные, его ip адрес в поле ip, дата ошибки в поле date, количество неудачных попыток в поле col.
А чему же тогда будет равен id? И как это использовать гибридную блокировку?
9. markus4 - 29 Апреля, 2010 - 14:31:52 - перейти к сообщению
Лучше всё-таки блокировать именно по IP.
Злоумышленник легко может просто из вредности ввести 3 раза неправильный пароль и логин, чтобы пользователя заблокировали.
Но есть одно НО - он должен знать чужой логин.
А вот это уже непреодолимое препятствие.
Блокировку мы пишем так, чтобы она срабатывала после 3 неправильных вводов пароля - НО только при правильном логине.
А если неправильный И логин, И пароль - тогда просто посылаем хакера в трещину.
Автоподбор логина опять же ничего не даст - у хакера всего 3 попытки.
10. vanicon - 29 Апреля, 2010 - 15:16:57 - перейти к сообщению
У меня логика такая:
Хакер взламывает пользователя, и если он ошибся в логине или пароле 3 раза, то блокируем хакера по его IP, на 15 минут (возможно ли это). Даже если хакер ошибся 3 раза только в пароле, а логин ввел правильно, то все ровно блокируем его по IP на 15 минут.
11. markus4 - 29 Апреля, 2010 - 16:30:06 - перейти к сообщению
На некоторых сайтах логины открыты для доступа. Например на этом форуме. Я например ввожу логин JustUser, и неправильный пароль... И так 3 раза. Что будет? (Не считая того что получу бан Улыбка Вероятно, после 3 ошибок нужно проверять привязку. если привязка правильна - заблокировать доступ на 30 секунд.
12. JustUserR - 30 Апреля, 2010 - 13:07:41 - перейти к сообщению
markus4 пишет:
Но есть одно НО - он должен знать чужой логин.
А вот это уже непреодолимое препятствие.
Множество сайтов и форумов открыты для чтения для любых анонимных пользователей - это сделано конечно же для удобства тех кто нашел определенную тему из поисковой системы и напрямую перешел по ссылке
С другой стороны гораздо лучше сделать обязательную капчу при входе - таким образом автоматический проход про всем логинам отпадает - и далее блокировать вход на определенных аккаунт с определенного IP на заданное время (Можно учитывать попытки рецедива)
markus4 пишет:
Автоподбор логина опять же ничего не даст - у хакера всего 3 попытки.
Если логины не открыты то это само оптимальное решение - если же открыты то я бы использовал гибридную проверку
13. vanicon - 30 Апреля, 2010 - 18:27:55 - перейти к сообщению
Если все же блокировать по IP, у меня вопрос может ли хакер подделать свой IP?
14. JustUserR - 30 Апреля, 2010 - 18:32:15 - перейти к сообщению
vanicon пишет:
Если все же блокировать по IP, у меня вопрос может ли хакер подделать свой IP?
Во-первых у хакера может быть динамический или WAP IP и таким образом с помощью атаки он может заблокировать целые подсети - если действовать только напрямую без гибридного подхода Во-вторых можно использовать различные proxy или куда уж там botnet (Если вы им особенно сильно не угодите Улыбка
15. vanicon - 30 Апреля, 2010 - 19:00:21 - перейти к сообщению
Что то я не очень понимаю логику гибридной блокировки, и как ее осуществить?

 

Powered by ExBB FM 1.0 RC1