Ограничение попыток входа в систему независимо от пользователя? - PullRequest
3 голосов
/ 31 июля 2009

У меня есть система входа, требующая имя пользователя и пароль. Я хочу отобразить капчу после определенного количества неудачных попыток входа в систему. Как правильно это реализовать? Я читал на этом сайте, и некоторые решения предлагают добавить «число неудачных попыток» в таблицу пользователей. Тем не менее, мне нужно, чтобы неудачные попытки не были привязаны к определенному пользователю - т.е. я хотел бы, чтобы капча отображалась независимо от того, существует ли введенное имя пользователя в системе. Будет ли хранить это в переменной сеанса нормально (я использую PHP)? Если так, то нет ли недостатка в том, чтобы просто перебрасывать данные по мере необходимости в переменные сеанса? У меня уже есть идентификатор сеанса для каждого посетителя сайта (либо вошел в систему, либо нет), поэтому я мог бы создать таблицу, которая связывает попытки входа в систему с этим идентификатором сеанса ... какие-либо идеи о том, что является лучшим / наиболее безопасным подходом? Спасибо.

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

Ответы [ 5 ]

6 голосов
/ 31 июля 2009

Опасность использования идентификатора сеанса заключается в том, что тот, кто пишет атаку методом "грубой силы", может просто очищать свои куки с каждой попыткой и, таким образом, давать ему новый сеанс.

Имейте в виду, что автоматическая атака грубой силой может быть написана на языке сценариев вне браузера, который может манипулировать файлами cookie, отправляемыми для каждого запроса.

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

ОБНОВЛЕНИЕ: необходимость очищать куки во время последовательных попыток перебора не замедлила бы атаку, поскольку этот процесс был бы автоматизирован и происходил почти мгновенно. Манипуляции с cookie-файлами в таких типах атак довольно распространены. Изменение файла cookie - это не то же самое, что очистка кэша вашего браузера (что обычно занимает некоторое время, потому что необходимо удалить несколько файлов). Все, что нужно сделать злоумышленнику - это предотвратить отправку файла cookie.

1 голос
/ 01 августа 2009

установить APC http://www.php.net/apc или memcache (d) http://www.php.net/memcache или здесь http://www.php.net/memcached (для memcache также требуется установить сервер memcached, см. Здесь http://www.danga.com/memcached/), затем Используйте соответствующие команды приращения для неудачных попыток входа с IP-адреса с таймаутом, который вам подходит (5 минут, 30 минут и т. д.). Это позволит вам БЫСТРО определить, происходит ли попытка грубой силы (без беспокойства). условий гонки) и автоматически истекает срок действия блока через определенное время.

Пример APC:

$max_attempts = 5;  // max attempts before captcha
$attempts = apc_fetch('login_attempts_'.$ip));
if($attempts and $attempts>$max_attempts){
    // block code here or redirect, captcha etc... also suggest a short sleep time to delay answer, slow down bot
}else{
    // check login here, run next code if login fails
    if($login_failed){
        if(!$attempts){
            apc_store('login_attempts_'.$ip,1,$timeout);
        }else{
            // function NOT currently documented on php.net, increments number stored in key
            apc_inc('login_attempts_'.$ip);
        }
    }
}

конечно, это очень грубый пример ... но вы поняли

1 голос
/ 31 июля 2009

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

1 голос
/ 31 июля 2009

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

0 голосов
/ 01 августа 2009

Наиболее точная информация, которую вы можете получить, это их IP-адрес. НЕ используйте cookie-файлы сеанса, если вы хотите, чтобы они были точными, поскольку пользователь может просто игнорировать ваш cookie-файл сеанса (т. Е. Использовать curl). Но если вас беспокоят общие ips, вы можете попытаться включить дополнительную информацию, такую ​​как агент браузера, или использовать ajax для передачи другой информации, которую вы не можете получить иначе. Но все остальное, кроме IP-адреса, может быть подделано (даже тогда вы можете использовать прокси).

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