Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.65/49: Рейтинг темы: голосов - 49, средняя оценка - 4.65
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
1

Блокировка пользователя после 3 неправильных вводов пароля

27.01.2016, 10:21. Показов 9625. Ответов 23
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
К примеру пользователь вводит логин или пароль неверно 3 раза его должно блокировать на 1 час.
Как это сделать ? просто только учусь (
Вот пример кода который уже накалякал
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
 /**
........
 */
 
 //Виход из авторизации
 if(isset($_GET['exit']) == true){
    //убиваем сесию
    session_destroy();
 
    // редірект
    header('Location:'. BEZ_HOST);
    exit;
 }
 
 
//...
 if(isset($_POST['submit']))
 {
    //Провіряємо на пустоту
    if(empty($_POST['lk']))
        $err[] = 'не ввели логин';
    
    if(empty($_POST['pass']))
        $err[] = 'не ввели пароль';
    
    //Проверка email
    /*if(emailValid($_POST['email']) === false)
        $err[] = 'Не коректний E-mail';*/
 
     //Проверка на ошибки
    if(count($err) > 0)
        echo showErrorMessage($err);
    else
    {
        /*Запрос на выборку из БД
        для проверки подлинности пользователя*/
        $sql = 'SELECT * FROM `'. BEZ_DBPREFIX .'site` AS `u`
                LEFT JOIN `'. BEZ_DBPREFIX .'role` AS `r` ON `u`.`role` = `r`.`id_role`
                WHERE `VPTR` = :lk';
            // PDO значенния для SQL запроса
        $stmt = $db->prepare($sql);
        $stmt->bindValue(':lk', $_POST['lk'], PDO::PARAM_STR);
        $stmt->execute();
 
        //Даные SQL
        $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
        
 
        //Если логин существует проверяем пароль
        if(count($rows) > 0)
        {
 
            //Даные из таблиц
            if($_POST['pass'] == $rows[0]['KOL_LG1'])
            {   
 
                //Переменная для работы с пользователем уже существующимся
 
                $_SESSION['user']   = true;
                $_SESSION['lk']     = $_POST['lk'];
                $_SESSION['role']   = $rows[0]['role'];
                $_SESSION['name']   = $rows[0]['FAMILY'];
                
 
                //Сбрасиваем параметры
                header('Location:'. BEZ_HOST .'?mode=1' );
                exit;
            }
            else
                echo showErrorMessage('Неверный логин');
        }else{
            echo showErrorMessage('Логин <b>'. $_POST['email'] .'</b> Нету такого логина!');
        }
    }
 }
 
?>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2016, 10:21
Ответы с готовыми решениями:

Почему после двух неправильных вводов значения z, цикл прерывается, а не продолжает запрашивать ввода данных?
#include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int stepen(int,int); int...

Блокировка сеанса пользователя после загрузки .
Нужно , что бы вся система загрузилась , но при этом весело окно ввода пароля для входа в сеанс...

Блокировка пользователя после нескольких неудачных попыток входа
Проект на asp net mvc 3 Не могу понять как организовать блокировку пользователя после 5 неудачных...

После изменения пароля пользователя SYS исчез Internal
После изменения пароля пользователя SYS исчез Internal, т.е. куда-то пропал псевдоним Internal...

23
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
27.01.2016, 10:26 2
Создаёте 2 колонки, например wrong_num и unblock_time. В первой храните количество неправильных попыток, во второй - время разблокировки.

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

Когда юзер вводит неправильный пароль, записываете +1 в БД и смотрите, сколько всего было сделано попыток. Если 3 - обнуляете и записываете время разблокировки текущее+час.
2
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
27.01.2016, 10:32  [ТС] 3
Получается до уже существующей БД допилить 2 таблицы?
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
27.01.2016, 10:53 4
qwertasdfgzxcvb, 2 таблицы? 0_о

Я привёл пример, можете использовать его как угодно.
0
25 / 25 / 11
Регистрация: 13.12.2011
Сообщений: 818
27.01.2016, 10:58 5
Цитата Сообщение от qwertasdfgzxcvb Посмотреть сообщение
Получается до уже существующей БД допилить 2 таблицы?
не обязательно, лучше использовать сессии. или куки на крайний случай, но куки почистить можно
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
27.01.2016, 10:59  [ТС] 6
Вот по поводу этого я и хотел услышать совет или что почитать чтобы разобраться.
0
40 / 40 / 23
Регистрация: 26.01.2012
Сообщений: 317
27.01.2016, 11:03 7
Зачем еще таблицы?? Просто добавьте в текущую еще 2 поля, как предложил Jodah, а при попытке логиниться пишите в это поле число попыток.
Но ошибиться можно не только в пароле, но и логине, поэтому сама система таких блокировок может получиться довольно сложной, для новичка!
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
27.01.2016, 11:23  [ТС] 8
Дописать 2 поля не выйдет так как данная таблица апдейтится из локального сервера раз в сутки а на локальном сервере нет смысла добавлять 2 поля
0
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
27.01.2016, 13:37 9
Цитата Сообщение от Mashka_mulashka Посмотреть сообщение
не обязательно, лучше использовать сессии.
Не лучше, а проще.
Такой способ защиты от подбора, основанный на сессиях, очень приятен хакеру.
PHPSESSID? А не будет у вас никакой PHPSESSID (веселый молочник)...при взломе сторонними программами, передачей пакетов, да даже при простейшем прокси.

Приблизительно так. Код может (и должен) быть модифицирован
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//session_start(); //Есть уже наверно...
$current_time=time(); //Не будем вызывать ф-цию много раз.
 
//Нет таких идентификаторов - получите
if (!isset($_SESSION['user_blocked_time'])) $_SESSION['user_blocked_time']=0;
if (!isset($_SESSION['try'])) $_SESSION['try']=0;
 
//Есть что? А если найду?
if (isset($_SESSION['user_blocked_time']))
{
if ($_SESSION['user_blocked_time']>$current_time) {Echo 'Вы заблокированы.'; exit;}
if ($_SESSION['user_blocked_time']<$current_time) $_SESSION['user_blocked_time']=0; //unset($_SESSION['user_blocked_time']);
}
 
 
//Проверим логин и пароль
if (тут условие что логин/пароль не верен)
{
if ($_SESSION['try']>=3) {Echo 'Вы заблокированы.'; exit;}
if ($_SESSION['try']<3) 
{
$_SESSION['try']++;
if ($_SESSION['try']>=3) {$_SESSION['user_blocked_time']=$current_time+3600; Echo 'Вы заблокированы.'; exit;} //Шо уже 3 раза? 
}
}
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
27.01.2016, 15:29  [ТС] 10
Да но блокировка сессии не сработает потому что сессия умирает после закрытия браузера(((
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
27.01.2016, 18:48 11
qwertasdfgzxcvb, ой зря, такой сайт залочится сможет в течении ночи, простым перебором логинов
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
27.01.2016, 20:02  [ТС] 12
так как правильно поступить ?
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
28.01.2016, 01:06 13
qwertasdfgzxcvb, не делать блокировку вот и все

Добавлено через 1 минуту
либо предусмотреть восстановление пароля через почту
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
28.01.2016, 11:27  [ТС] 14
Пункта регистрации у меня нету. Все пользователи уже зарегистрированные и пароли у них не могут изменятся.
Чтобы любые данные изменить им нужно обратится к нам в офис, потому и восстановление не будет.
А банально если кто захочет попробовать и вдруг угадать вот для такого мне это и нужно)))
походу придется делать таблицу(
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
28.01.2016, 11:51 15
Цитата Сообщение от qwertasdfgzxcvb Посмотреть сообщение
а на локальном сервере нет смысла добавлять 2 поля
Не понял, почему нет смысла?
Цитата Сообщение от qwertasdfgzxcvb Посмотреть сообщение
походу придется делать таблицу(
А создавать новую таблицу значит есть смысл?
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
28.01.2016, 12:04  [ТС] 16
Просто на локалке БД в 986 таблиц ну и нарушать принцип работы не хочется, темболия бд там в фаербьорде а там стоят определенные зависимости(
0
116 / 117 / 52
Регистрация: 19.12.2014
Сообщений: 612
28.01.2016, 12:28 17
qwertasdfgzxcvb, еще раз говорю если кто то прочухает это дело, то перебором паролей можно заблокировать всех пользователей? и делать это постоянно? пока у кого нибудь не бомбонет и у него вырастут руки на плечах и он сделает намного лучше
1
165 / 89 / 38
Регистрация: 29.06.2015
Сообщений: 1,098
28.01.2016, 13:14 18
Цитата Сообщение от qwertasdfgzxcvb Посмотреть сообщение
Да но блокировка сессии не сработает потому что сессия умирает после закрытия браузера(((
Сессия умирает, в базу вы писать не хотите, куки разумеется не вариант.

И есть мнение
Цитата Сообщение от lokilo Посмотреть сообщение
qwertasdfgzxcvb, еще раз говорю если кто то прочухает это дело, то перебором паролей можно заблокировать всех пользователей?
Значит придется делать по топорному. Ужас конечно, но другого варианта нет...
Создавать на сервере папку, в которой будут лежать файлы отвечающие за блокировку.
Принцип приблизительно такой
ошибся раз - создали txt файл в папке. Имя файла=логин юзера. Содержимое файла=кол-во попыток входа, время блокировки и ip.
При следующем входе узнаем ip и ищем файл с этим ip. Смотрим как там со временем блокировки, попытками входа. Изменяем если нужно.
Вообщем все из сессий перенести в файлы.
1
0 / 0 / 0
Регистрация: 11.11.2014
Сообщений: 59
28.01.2016, 16:04  [ТС] 19
вот как ето сделать я точно не знаю(( ну и мне кажется будет нагрузка на серверную часть очень большая по созданию файла и тд.....
0
Эксперт PHP
3851 / 3196 / 1343
Регистрация: 01.08.2012
Сообщений: 10,820
28.01.2016, 16:15 20
Зачем файлы? Можно и в БД эту информацию хранить.

А изначально задача какая? Просто блок юзеров - не совсем удобно. Может капчу повесить?
1
28.01.2016, 16:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2016, 16:15
Помогаю со студенческими работами здесь

Выполнение кода после ввода пароля текущего пользователя
Суть такая, есть у меня клиент для работы со службой и надо приостановить службу, но предварительно...

Смена пароля пользователя после первого входа в Lotus
Доброго времени суток. Такая проблема. При регистрации руками хочется задать простой пароль, а...

Блокировка пользователя после нескольких неудачных попыток входа при использовании membership service
Уважаемые Гуру! В silverlight приложении используется стандартная авторизация из silverlight...

При смене пароля: проверка на совпадение пароля с фамилией пользователя
Здравствуйте, я не разбираюсь в Паскале, поэтому прошу, помогите написать программу по заданию:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru