Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> количество попыток авторизации, .. чтоб не подбирали часами пароли )) 
:(
    Опции темы
gringlin
Дата 14.3.2005, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.3.2005

Репутация: нет
Всего: нет



как можно подсчитывать количество попыток введения неправильных логинов и паролей?
авторизация сделана через session_start()....
.. чтобы, если это количество превышает 3, фору совсем убрать ))

.. а то ведь там кто-нить засядет на часок.. пароли подбирать ))
того гляди и подберет smile
PM MAIL   Вверх
IZ@TOP
Дата 14.3.2005, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



gringlin, если с сессиями, то все очень просто:
Код

<?php
session_start();

$maxAttempts = 5; // Максимальное число попыток авторизации
$blockTimeout = 3600; // Таймаут блокировки
$authAccept = true;

$ips = file('db/badip.txt'); // считываем файл с данными о пользователях превысивших максимально допустимое количество попыток авторизации.
     // формат записи:
     // ip addr:timestamp
     // 127.0.0.1:1545485748

while($n = array_shift($ips)) {
     $n = explode(':', trim($n));

     if(time() - $blockTimeout > $n[1]) { // Если время не истекло, обновляем массив. В противном случае возврат.
          $newIps[] = $n[0].':'.$n[1];
          continue;
     }

     if($n[0] == $_SERVER['REMOTE_ADDR']) 
          $authAccept = false;
}

// ... далее перезаписываем в файл badip.txt массив $newIps
$fh = fopen('db/badip.txt', 'w');
fputs($fh, implode("\r\n", $newIps)."\r\n");
fclose($fh);

if(isset($_SESSION['block'])) {
     if($_SESSION['block'] < time() - $blockTimeout) {
          unset($_SESSION['block'];
     } else {
          $authAccept = false;
     }
    
}

if($authAccept) {
     // Все ок. Выводим форму авторизации

     // если пароль/логин неверный - $_SESSION['countAttempts']++.

} else {
     echo "Вы временно заблокированы и не можете повторять попыто авторизации";
}
// если $_SESSION['countAttempts'] >= $maxAttempts
$_SESSION['block'] = time();

?>


Это примерный набросок. Если что-то неясно, спрашивай.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
gringlin
Дата 15.3.2005, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 8.3.2005

Репутация: нет
Всего: нет



... cool smile полезный код))

а можно ли как-нить без записей в файл?
.. ну ... я имею в виду без блокировки IP..

... просто я уже запарился с функциями..
в смысле с их переменными smile ..
форма у меня должна по идее присутствовать на каждой странице... а писать для каждой страницы одинаковый код - эт, наверное, не есть хорошо smile поэтому пытаюсь как-нить раскидать его по функциям в отдельный файл.. и возникают постоянные проблемы с областью действия переменных smile
в связи с этим хочу вот что спросить - если подключать файл с функциями includом - в этом случае правила действия переменных сохраняются?

в общем, вот что у меня прописано в каждом файле на месте формы авторизации:
Код

if (session_is_registered("xxx"))
        { }   // этим способом у меня скрывается форма, им же хотелось бы ее скрыть если количество попыток > 3.
    else
        {
        if (session_is_registered("valid_user")) // авторизация прошла успешно
            {
            privet($valid_user); // приветствие userа
            }
            else
            {
            if (isset($userid)) // авторизация прошла не успешно и в переменной есть логин
                {
                incorrect (); // вывод сообщения о неправильных логине или пароле .. здесь хотелосьбы проводить подсчет и вывод попыток.
                }
            display_login_form (); // отображение формы
            }
        }

.. понятно, конечно, что после перезагрузки браузера форма появтися снова.. но это, в моем случае - нормально ))

проблема в том - как в функции incorrect () (точней с помощью чего) можно вести подсчет количества попыток?
PM MAIL   Вверх
Opik
Дата 15.3.2005, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Vingrad developer
Сообщений: 1918
Регистрация: 6.10.2004
Где: Рига

Репутация: 24
Всего: 55



не используй session_is_registered - это устарело.
юзай $_SESSION

PM MAIL Skype   Вверх
IZ@TOP
Дата 15.3.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

Репутация: 44
Всего: 73



gringlin, а не проще увязать все в несколько действий?

Код

<?php // security.php

function displayForm() {
    //... вывод формы авторизации
}

function accessDenied() {
    die("Access denied");
}

function checkAccess() {
    //... главная функция проверки регистрации пользователя и блокироврок в случае неудачных попыток.
    if(isset($_SESSION['validUser'])) {
        echo "Hello user!";
    } else {
        if(isset($_SESSION['block'])) {
            if(blockOnIp()) {
                accessDenied();
            }
            
            if($_SESSION['block'] > time() - 3600) {
                accessDenied();
            }
        } else {
            displayForm();
        }
    }
}

function blockOnIp() {
    //... проверка присутствия ip  в черном списке блокировки. в случае удачи ретурнить true.
}

function checkUser() {
    //... а тут проверяем юзера, если не прошел проверку увеличиваем countAtempts на 1. Если count Attempts превышает заданный придел, логируем запись ip и таймстампа и запрещаем вход.
}

?>


Код

<?php // index.php

require 'security.php';

checkAccess(); // запускам проверку.

?>


Вот такие вот дела.
Добавлено @ 10:47
А вообще про авторизацию очень много писали на phpclub.ru.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
Flex[ip]
Дата 18.3.2005, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 25.10.2004

Репутация: нет
Всего: нет



Можно воспользоваться такой функцией, она правда не блокирует юзера, но Бруту препятствует успешно.

Код

<?php

function SecurLogIn($fuser, $fpass) {

        $time = 5; // Укажите нужное количество секунд, которое и будет препятствовать Бруту

        // Боремся с sql-inject
        $fuser = addslashes($fuser);
        $fpass = addslashes($fpass);

        // Отправляем запрос на получение времени последней ошибки
        $ti = mysql_query("select err from `table` where user='$fuser'");
        $tm = mysql_fetch_array($ti);
        $tim = time();

        // Обновляем время последней ошибки
        $sql = mysql_query("update `table` set err='$tim' where user='$fuser'");

        // Если с момента последней ошибки прошло более 5 секунд
           if ($tm[0] + $time > time())
             {
                 return 0;
             }

        // Хешируем веденный пользователем пароль
        $mdpass = md5('blablabla_'.md5($fpass));

        // Запрос к БД с целью выяснения существования соответствующей записи
        $query = "SELECT count(*) FROM `table` WHERE
                  user = '$fuser' and
                  pass = '$mdpass'";

        $result = mysql_query($query);

          if (!$result)
             {
                echo "Не возможно выполнить запрос!";
                exit;
             }

        $count = mysql_result($result, 0, 0);

          if ($count > 0) {

             // Если комбинация верна
             return 1;
          } else {

             // Если комбинация неверна
             return 0;
          }

}

?>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.