Я занимаюсь разработкой веб-приложения на PHP, и основной задачей приложения является безопасность. До сих пор я сохранял данные аутентификации в 2 файлах cookie:
- одно печенье для уникальной строки хеша (30 символов)
- один файл cookie для уникального идентификатора (первичный ключ таблицы базы данных mysql, в которой хранится информация о файле cookie и идентификатор пользователя)
Таблицы БД выглядят так:
- Пользователи ( user_id , имя пользователя, пароль)
- Cookies ( cookie_id , user_id, hash, time, ip)
Когда пользователь заходит на страницу, приложение проверяет наличие файлов cookie (проверка файлов cookie) на клиенте и сравнивает их с таблицей базы данных Cookies. Если строка хеша и идентификатор совпадают, сеанс продлевается, а если нет, сеанс уничтожается (если существует), и пользователю предлагается войти в систему. Он также проверяет, истек ли сеанс, сравнивая текущую отметку времени с отметкой времени последней операции.
Когда пользователь входит в хеш-строку, он генерируется и сохраняется в базе данных (текущая отметка времени и IP-адрес также сохраняются). Первичный идентификатор вновь созданной строки и строки хеша затем сохраняются в двух файлах cookie и используются для аутентификации.
Я хотел бы внедрить дополнительную безопасность для предотвращения атак по словарю или методом "грубой силы", подавляя попытки входа в систему и проверки файлов cookie. Я хотел бы добиться этого, когда пользователь не может N раз войти в систему или проверить файлы cookie, которые он блокирует на 20 минут. Но если я сделаю это, используя IP, я потенциально заблокирую каждого пользователя, использующего этот IP.
Я мог заблокировать определенную учетную запись пользователя, когда было предпринято более X неудачных попыток, но проблема в том, что злоумышленник не предоставил правильное имя пользователя (поэтому мне пришлось бы заблокировать весь IP на N минут).
Форма входа также имеет проверку капчи, но это только замедляет атаку (ничто по сравнению с отказом в попытках входа в течение X минут).
- Есть ли другой способ запретить попытки входа в систему без блокировки всей сети, использующей этот IP?
- Должен ли я отказываться от попыток входа в систему, когда есть N неудачных проверок cookie?
- Если куки пользователя украдены, я использую IP в таблице Cookie, чтобы предотвратить его повторное использование, поэтому куки могут использоваться только с того же IP, что и пользователи. Это безопасно, или я должен сделать это как-нибудь еще?
Заранее спасибо,
PS: все пароли в базе данных хэшируются, значения cookie кодируются перед использованием в запросе db (поэтому инъекции невозможны).