Отслеживание попыток входа с использованием куки PHP - PullRequest
5 голосов
/ 05 ноября 2011

Мне дали домашнее задание, в котором мне нужно создать капчу для входа в раздел «Комментарии».

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

Вот моя проблема. Нам говорят, что пользователю разрешено пробовать столько раз, сколько он пожелает, однако, если они терпят неудачу 5 раз в течение тридцати секунд, они блокируются на три минуты.

Я понимаю, как отследить 5 пропущенных попыток, но как бы вы отследили время на этой? Если пользователь попробовал 4 раза за 15 секунд, а затем подождал минуту (или меньше, очевидно), часы сбрасываются, и у них есть еще 5 попыток. Кроме того, если они попробуют дважды и подождут 30 секунд, попытки будут повторяться.

Нужно ли мне устанавливать временный куки-файл, вторичный куки-счетчик (для соответствия оригинальному куки-счетчику) и отслеживать запуск вторичного счетчика и просто посмотреть, увеличивается ли этот счетчик до 5? Как бы вы это сделали?

EDIT:

Должен извиниться, видимо, я не совсем понял свою ситуацию. В этом домашнем задании строго оговаривается, что мы должны использовать куки для выполнения этой задачи. На данный момент мы не рассматриваем лучшие практики или меры безопасности, инструктор просто хочет, чтобы нам было удобно с файлами cookie. К сожалению, сеанс не подходит для меня, я должен использовать куки.

Ответы [ 6 ]

3 голосов
/ 05 ноября 2011

Если вы пометили это как PHP, просто запустите сеанс с session_start(). Это дает каждому пользователю уникальный идентификатор через cookie, и вы можете сохранить их попытки входа в систему в массиве $_SESSION на сервере. При каждой попытке входа в систему вы можете проверить записанные попытки, сохраненные в сеансе, и посмотреть, превышают ли они допустимую частоту попыток.

Конечно, обычные предупреждения верны: в реальной системе безопасности злоумышленник вряд ли сохранит этот файл cookie сеанса в течение своих многочисленных попыток - он будет игнорировать его, заставляя каждый раз создавать новый пустой сеанс.

2 голосов
/ 05 ноября 2011

Поскольку это домашнее задание, для вас нет кода!

На высоком уровне все, что вам нужно сделать, это сохранить временные метки вместо «счета».Затем при каждом запросе вы можете отбрасывать метки времени старше 30 секунд и считать остальные.

2 голосов
/ 05 ноября 2011

Я бы не стал делать это в куки!Пользователи могут легко обойти это, делая вашу систему совершенно небезопасной.

Вы должны регистрировать каждую попытку входа в базу данных.Затем просто запросите попытки, сделанные в указанный период времени, когда они пытаются войти в систему.Если они уже пытались слишком часто, не впускайте их.

1 голос
/ 05 ноября 2011

Вопрос защиты вашей системы от злонамеренного пользователя должен решаться на стороне сервера. Вы можете использовать комбинацию IP и имени пользователя, пытаясь войти в систему, чтобы создать уникальный идентификатор для этого человека. Если эта комбинация учетных данных пытается принудительно войти в систему, заблокируйте ее на 5 минут.

0 голосов
/ 05 ноября 2011

Я бы регистрировал каждую неудачную попытку как массив в сеансе.

Вот код и псевдокод.

<?
// Check if they are locked out.
if ($_SESSION['lockedOutTime'] < (time() - (3*60))) {

    // they are locked out; don't attempt login

    // notify them that they are still locked out



// If they aren't locked out, allow them to attemp the login
} else {

    // Attempt login
    // ...

    // if failed... log it
    $_SESSION['failedLoginAttempts'][] = time();

    $thirtySecondsAgo = time();
    $failedAttemptsInTheLastThirtySeconds = 0;


    // count failed login attempts in the last 30 seconds
    foreach ($_SESSION['failedLoginAttempts'] as $failedAttempTime) {

        if ($failedAttempTime >= $thirtySecondsAgo) {

            $failedAttemptsInTheLastThirtySeconds++;

        }

    }

    // Check if they are over the limit
    if ($failedAttemptsInTheLastThirtySeconds >= 5) {

        // lock em out
        $_SESSION['lockedOutTime'] = time();

        // Notify user they have been locked out
        // ...

    }



}

?>
0 голосов
/ 05 ноября 2011

Я бы реализовал спецификацию как есть и не пытался бы ее интерпретировать. Это усложнит задачу.

Для реализации я предлагаю использовать сеансы или журналы на стороне сервера, а не обрабатывать файлы cookie, сделанные вручную. Вы можете сохранить время каждой попытки входа в систему для пользователя, прежде чем каждая проверка подлинности проверяет последние 5 попыток. если первое значение меньше тридцати секунд, предупредите пользователя и отключите форму входа на 5 минут. Вы можете сохранить время разблокировки формы в пользовательском сеансе (добавив секунды ожидания ко времени последней неудачной попытки), и поэтому каждый запрос формы входа будет неудачным, если время сервера меньше, чем разблокировка время. Когда форма разблокирована, удалите метку времени разблокировки в сеансе пользователя и снова включите форму.

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