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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Закрытие доступа на 15 минут

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Необходимо закрыть доступ, если информацию ввели неверно
vanicon
Отправлено: 27 Апреля, 2010 - 20:35:45
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




В таблице 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 минут, помогите разобраться


-----
Так было, так есть и так будет
 
 Top
ZeiZ
Отправлено: 27 Апреля, 2010 - 21:12:52
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


Помог: 0 раз(а)




Немного поменял логику и структуру таблицы 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;
Если нет, то закрываем доступ

примерно так,
З.Ы. последний абзац должен идти в самом начале кода, я написал, чтоб это можно было понять логичнее.

(Отредактировано автором: 27 Апреля, 2010 - 21:16:10)

 
 Top
vanicon
Отправлено: 28 Апреля, 2010 - 05:56:53
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




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


-----
Так было, так есть и так будет
 
 Top
ZeiZ
Отправлено: 28 Апреля, 2010 - 06:49:54
Post Id



Частый гость


Покинул форум
Сообщений всего: 231
Дата рег-ции: Нояб. 2009  
Откуда: Москва


Помог: 0 раз(а)




Если Вы хотите закрыть форму авторизации на 15 минут, то как минимум перед выводом формы надо сделать условие выводить её или нет.

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

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

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

Используйте капчу, будет проще. Потом можно и на капчу блок поставить, если совсем параноя будет =).

(Отредактировано автором: 28 Апреля, 2010 - 06:50:51)

 
 Top
JustUserR
Отправлено: 28 Апреля, 2010 - 09:26:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vanicon пишет:
Мне просто вместо этого вывода нужно закрыть соединение на несколько минут и все
Работа PHP-скриптов организована таким образом что соединение от пользователя принимается в любом случае - при этом сначала происходит загрузка GET/POST и только потом уже выполнение вашего PHP-скрипта - поэтому вы должны име в виду что даже если вы заблокируете какой-то IP-адрес то он может продолжать спокойно слать запросы вашему PHP-скрипту (При этом максимальная длина запроса ограничена только в настройках php.ini или самого Apache)
ZeiZ пишет:
Для этого в базе должна быть таблица-лог со всеми входами в систему. Я бы вообще сделал лог типа: (id, ip, time, ok) где ок - 1 - вошел, 0 - неполучилось.
Индентифицировать пользователя по IP не есть хорошо. IP - часто динамический, его можно подделать\изменить + блокировкой IP можно заблокировать сотню порядочных пользователей.
Это верно посколько здесь надо держаться золотой середины - с одной стороны нельзя блокировать IP а с другой вход на определенный аккаунт (А вдруг кто-то будет специально вводить неверные пароли другому пользователю чтобы тот не вошел Улыбка - поэтому надо держать в БД входов и IP-адрес и логин Плюс если на логин пользователья было множество неудачных попыток войти - то отправить ему письмо с предложением сменить пароль (Пока его не смогли подобрать)


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
vanicon
Отправлено: 28 Апреля, 2010 - 14:52:10
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Блокировать не по ip а по id, а id чему будет ровняться или у него будет auto_increment. А если вместо блокировки пользователя выводить ему капчу, то есть если пользователь ошибся 3 раза появляется капча, или это не сможет защитить от подбора паролей.

(Отредактировано автором: 28 Апреля, 2010 - 14:55:11)



-----
Так было, так есть и так будет
 
 Top
JustUserR
Отправлено: 29 Апреля, 2010 - 13:28:59
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vanicon пишет:
Блокировать не по ip а по id, а id чему будет ровняться или у него будет auto_increment
Блокировать по чистому IP тоже нельзя - ведь злоумышленник может легко написать робота который будет анализировать список пользователей на сайте - и для каждого из них автоматически рассылвать неверные авторазиционные запросы - и таким образом получится что он создаст эффект Dos-атаки за счет того что все пользователи окажутся заблокированными
Поэтому лучше использовать гибридную блокировку - по ID и по IP в разумном соотношении и на разумное время - и также высылать уведомительное письмо пользователю которго хотели взломать чтобы он мог сменить пароль
Что касается auto_increment то он работает только для KEY PRIMARY ID - иначе используйте собственный триггер для обработки увеличения значения


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
vanicon
Отправлено: 29 Апреля, 2010 - 14:06:47
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




JustUserR пишет:
Поэтому лучше использовать гибридную блокировку - по ID и по IP в разумном соотношении и на разумное время - и также высылать уведомительное письмо пользователю которго хотели взломать чтобы он мог сменить пароль

То есть если пользователь не ввел пароль три раза, заносятся данные, его ip адрес в поле ip, дата ошибки в поле date, количество неудачных попыток в поле col.
А чему же тогда будет равен id? И как это использовать гибридную блокировку?


-----
Так было, так есть и так будет
 
 Top
markus4
Отправлено: 29 Апреля, 2010 - 14:31:52
Post Id



Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




Лучше всё-таки блокировать именно по IP.
Злоумышленник легко может просто из вредности ввести 3 раза неправильный пароль и логин, чтобы пользователя заблокировали.
Но есть одно НО - он должен знать чужой логин.
А вот это уже непреодолимое препятствие.
Блокировку мы пишем так, чтобы она срабатывала после 3 неправильных вводов пароля - НО только при правильном логине.
А если неправильный И логин, И пароль - тогда просто посылаем хакера в трещину.
Автоподбор логина опять же ничего не даст - у хакера всего 3 попытки.


-----
Нет вокруг ничего кроме бесконечного журчания опкодов вселенной...
 
 Top
vanicon
Отправлено: 29 Апреля, 2010 - 15:16:57
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




У меня логика такая:
Хакер взламывает пользователя, и если он ошибся в логине или пароле 3 раза, то блокируем хакера по его IP, на 15 минут (возможно ли это). Даже если хакер ошибся 3 раза только в пароле, а логин ввел правильно, то все ровно блокируем его по IP на 15 минут.


-----
Так было, так есть и так будет
 
 Top
markus4
Отправлено: 29 Апреля, 2010 - 16:30:06
Post Id



Гость


Покинул форум
Сообщений всего: 78
Дата рег-ции: Март 2010  


Помог: 0 раз(а)




На некоторых сайтах логины открыты для доступа. Например на этом форуме. Я например ввожу логин JustUser, и неправильный пароль... И так 3 раза. Что будет? (Не считая того что получу бан Улыбка Вероятно, после 3 ошибок нужно проверять привязку. если привязка правильна - заблокировать доступ на 30 секунд.


-----
Нет вокруг ничего кроме бесконечного журчания опкодов вселенной...
 
 Top
JustUserR
Отправлено: 30 Апреля, 2010 - 13:07:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




markus4 пишет:
Но есть одно НО - он должен знать чужой логин.
А вот это уже непреодолимое препятствие.
Множество сайтов и форумов открыты для чтения для любых анонимных пользователей - это сделано конечно же для удобства тех кто нашел определенную тему из поисковой системы и напрямую перешел по ссылке
С другой стороны гораздо лучше сделать обязательную капчу при входе - таким образом автоматический проход про всем логинам отпадает - и далее блокировать вход на определенных аккаунт с определенного IP на заданное время (Можно учитывать попытки рецедива)
markus4 пишет:
Автоподбор логина опять же ничего не даст - у хакера всего 3 попытки.
Если логины не открыты то это само оптимальное решение - если же открыты то я бы использовал гибридную проверку


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
vanicon
Отправлено: 30 Апреля, 2010 - 18:27:55
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Если все же блокировать по IP, у меня вопрос может ли хакер подделать свой IP?


-----
Так было, так есть и так будет
 
 Top
JustUserR
Отправлено: 30 Апреля, 2010 - 18:32:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




vanicon пишет:
Если все же блокировать по IP, у меня вопрос может ли хакер подделать свой IP?
Во-первых у хакера может быть динамический или WAP IP и таким образом с помощью атаки он может заблокировать целые подсети - если действовать только напрямую без гибридного подхода Во-вторых можно использовать различные proxy или куда уж там botnet (Если вы им особенно сильно не угодите Улыбка


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
vanicon
Отправлено: 30 Апреля, 2010 - 19:00:21
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Что то я не очень понимаю логику гибридной блокировки, и как ее осуществить?


-----
Так было, так есть и так будет
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB