#php #cookies
#php #файлы cookie
Вопрос:
Мне дали домашнее задание, в котором мне нужно создать captcha для входа в раздел «комментарии».
У меня капча работает нормально, никаких проблем. Нам также поручено вести учет неудачных попыток ввода капчи. Нет проблем.
Вот моя проблема. Нам говорят, что пользователю разрешено пытаться столько раз, сколько он или она пожелает, однако, если они потерпят неудачу 5 раз в течение тридцати секунд, они будут заблокированы на три минуты.
Я понимаю, как отслеживать 5 пропущенных попыток, но как бы вы отследили время для этой попытки? Если пользователь попытался 4 раза за 15 секунд, а затем подождал минуту (или меньше, очевидно), часы сбрасываются, и у них есть еще 5 попыток. Кроме того, если они попытались дважды и подождали 30 секунд, попытки повторятся.
Нужно ли мне установить файл cookie time, дополнительный файл cookie count (чтобы соответствовать исходному файлу cookie count) и отслеживать начало дополнительного счетчика и просто посмотреть, увеличивается ли этот счетчик до 5? Как бы вы это сделали?
Редактировать:
Должен извиниться, по-видимому, я не совсем понял свою ситуацию. В этом домашнем задании строго оговорено, что мы должны использовать файлы cookie для выполнения этой задачи. На данный момент мы не рассматриваем лучшие практики или безопасность, инструктор просто хочет, чтобы нам было удобно использовать файлы cookie. К сожалению, сеанс не подходит для меня, я должен использовать файлы cookie.
Ответ №1:
Учитывая, что вы пометили это как PHP, просто начните сеанс с session_start()
. Это дает каждому пользователю уникальный идентификатор через файл cookie, и вы можете хранить их попытки входа в $_SESSION
массив на сервере. При каждой попытке входа в систему вы можете проверить записанные попытки, сохраненные в сеансе, и посмотреть, не превышают ли они допустимую частоту попыток.
Конечно, сохраняются обычные предупреждения: в реальной системе безопасности злоумышленник вряд ли сохранит этот файл cookie сеанса в течение многих попыток — он проигнорирует его, заставляя каждый раз создавать новый пустой сеанс.
Комментарии:
1. Мы должны преподавать здесь лучшие практики, да? Учитывая, что клиент может сбросить этот сеанс, сбросив свои файлы cookie, это совсем не хорошая идея.
2. Я вижу это. Я бы ни капельки не удивился, увидев, что кто-то пришел и реализовал то, что вы предложили, несмотря на ваше предупреждение, просто потому, что это «проще». Ну что ж, я думаю, это их проблема.
3. В моем ответе я включил метод, позволяющий запретить людям обходить систему безопасности путем сброса своих файлов cookie.
4. Учитывая обычные предупреждения, какие могут быть альтернативы?
5. Не существует 100% надежных методов. Веб принципиально не имеет состояния, и все методы, используемые для добавления состояния, имеют плюсы / минусы. Файлы cookie можно просто игнорировать. Блокировка по ip наносит ущерб тем, кто находится за теми же прокси / nat-шлюзами, что и злоумышленники, и т.д… В какой-то момент вы должны провести черту на песке и сказать: «мы готовы доставить столько проблем в обмен на такую большую выгоду».
Ответ №2:
Я бы вообще не стал этого делать в файлах cookie! Пользователи могут легко обойти это, что делает вашу систему довольно небезопасной.
Вы должны регистрировать каждую попытку входа в базу данных. Затем просто запросите попытки, предпринятые в течение указанного вами периода времени, когда они пытаются войти в систему. Если они уже пытались слишком часто, не впускайте их.
Ответ №3:
Поскольку это домашнее задание, никакого кода для вас!
На высоком уровне все, что вам нужно сделать, это сохранить временные метки вместо «count». Затем при каждом запросе вы можете отбрасывать временные метки старше 30 секунд и считать остальные.
Ответ №4:
Вопрос защиты вашей системы от злоумышленников должен решаться на стороне сервера. Вы могли бы использовать комбинацию IP и имени пользователя при попытке входа, чтобы создать уникальный идентификатор для этого человека. Если эта комбинация учетных данных попытается принудительно войти в систему, заблокируйте этого пользователя на 5 минут.
Ответ №5:
Я бы реализовал спецификацию как есть и не пытался бы ее интерпретировать. Это увеличило бы сложность проблемы.
Для реализации я предлагаю использовать сеансы или журналы на стороне сервера вместо обработки файлов cookie, сделанных вручную. вы могли бы сохранять время каждой попытки входа для пользователя, перед каждой проверкой подлинности проверяйте последние 5 попыток. если время первого значения меньше тридцати секунд, предупредите пользователя и отключите форму входа на 5 минут. вы могли бы сохранить время разблокировки формы в сеансе пользователя (добавив секунды ожидания ко времени последней неудачной попытки), и поэтому каждый запрос на форму входа в систему не удался бы, если время сервера меньше времени разблокировки. Когда форма будет разблокирована, удалите отметку времени разблокировки в сеансе пользователя и снова включите форму.
Ответ №6:
Я бы регистрировал каждую неудачную попытку в виде массива в сеансе.
Вот некоторый код и псевдокод.
<?
// 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
// ...
}
}
?>