Предотвращение D/DoS-атак PHP/Redis Session

Я реализовал свой собственный SessionHandlerInterface, который читает/записывает пользовательские сеансы и постоянные сеансы на сервер Redis. Срок действия файла cookie сеанса пользователя истекает в момент закрытия браузера, поэтому связанный сеанс Redis необходимо очистить. Я могу убрать это, установив срок действия, например, 30 минут, что приведет к тому, что пользователь будет получать новый сеанс очень 30 минут без прерывания из-за наличия постоянного сеанса. Когда пользователь входит в систему, я автоматически создаю постоянный файл cookie, который позволяет ему войти в систему в течение нескольких месяцев.

Как предотвратить D/DoS-атаку, когда пользователь программно получает файл cookie сеанса пользователя и/или постоянный файл cookie, удаляет его и продолжает запрашивать и удалять файл cookie в течение неопределенного времени? По сути, создание бесконечного количества потерянных пользователей или постоянных сеансов в Redis, которые в конечном итоге будут очищены. Даже если я уменьшу срок действия файлов cookie сеанса до 1 минуты, чтобы несколько снизить риск, это все равно оставит постоянную проблему с файлами cookie, когда срок их действия не истекает в течение нескольких месяцев. Это может легко привести к сбою моего менеджера сеансов и помешать всем пользователям войти в систему.

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

Эта проблема поднималась ранее: Потерянные записи управления сеансами в базе данных. Как справиться с проблемой? Риск стабильности БД


person Runicode    schedule 16.02.2019    source источник


Ответы (1)


Я считаю, что у меня есть решение, идентифицированное вне использования брандмауэра.

В Redis как для сеанса пользователя, так и для постоянного сеанса я буду использовать хэш и хранить идентификатор пользователя вместе с любой соответствующей информацией. В то время, когда необходимо создать нового пользователя или постоянный сеанс, поиск в Redis будет выполняться для любого существующего пользователя и/или постоянного сеанса (в зависимости от того, запрашивается ли пользовательский сеанс или постоянный сеанс), и если он существует, еще не истек, либо перезапишите его, либо удалите и создайте новый.

Это должно гарантировать, что для пользователя не может существовать более одного пользовательского сеанса или постоянного сеанса, и должно аннулировать любую сессионную атаку DoS.

person Runicode    schedule 17.02.2019