Функция попыток входа в систему безопасности PHP - PullRequest
1 голос
/ 29 июля 2011

Я работаю над формой входа в систему, и мне нужно ограничить количество попыток до 3, а затем заблокировать любую отправленную форму на 10 минут.Следующий код не работает правильно, и мне нужно знать, как заблокировать отправку после неудачных попыток.Спасибо.

function autoDefender($attempts,$username,$pass)
    {
    $logins=0;
    $logins++;
    $ats = $attempts-$logins;
        if (isset($_POST['password']) && isset($_POST['userName']))
        {
            if($_POST['password']!=$pass && $_POST['userName']!=$username)
                {   
                    if($logins == $attempts)
                        {
                         echo ("<div class='errmg'>Acess denied for 1 minute</div>");
                        }
                    echo ("<div class='errmg'>Error:
                    invalid username or pass; <span class='atmpts'>$ats</span> attempts left</div>");
                }
        }
    }

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

Проблема здесь в том, что при каждом вызове autoDefender локальная переменная $logins сбрасывается на 0.Таким образом, состояние того, сколько попыток действительно имело место, не поддерживается для нескольких вызовов autoDefender.

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

Обратите внимание, что это также создает поверхность атаки для атак типа «отказ в обслуживании», поскольку вы можете заблокировать других пользователей.Поэтому вам следует дважды подумать, кому вы приписываете неудачную попытку.Если вы делаете это для каждого пользователя, вы, злоумышленник, можете заблокировать множество пользователей, когда делаете массовую атаку на всех пользователей.Если вы сделаете это для каждого удаленного клиента (например, IP-адрес), вы можете заблокировать других невинных пользователей, которые просто используют ту же систему (например, сеть компании или университета).Если вы делаете это за сеанс, злоумышленник может просто сбросить выданный идентификатор сеанса.

1 голос
/ 29 июля 2011

Поскольку ваш код выполняется каждый раз с самого начала, поэтому каждый раз, когда $ logins инициализируется с 0. Итак, вам нужно инициализировать вашу переменную не с 0, а со значения числа предыдущих попыток входа с этого ip (которыйдолжен храниться где-то, то есть в базе данных).

Не прислушиваться к предложениям хранить $ logins на cookie (или sesstion).Он может (и будет) просто удален злоумышленником.Вместо этого, храните его где-нибудь на стороне сервера: база данных sql, memcached, berkley db, ... есть много вариантов.

Наконец, мне кажется, вы неправильно понимаете основы (веб, а может и нет)только веб) концепции программирования, поэтому лучше перепроверить код с вашим наставником или использовать сайт обзора кода из сети stackexchange.Особенно при написании столь важного кода, связанного с безопасностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...