Реализация временного бана с записью времени в базу данных
Временная блокировка пользователей - частая задача при разработке веб-приложений. Чтобы реализовать временный бан, необходимо записать время начала блокировки или время её окончания в базу данных, а затем при каждом запросе проверять, не истёк ли срок. Рассмотрим пошаговую реализацию на примере PHP и MySQL.
Выбор структуры таблицы для хранения бана
В таблице пользователей или в отдельной таблице bans добавьте поле для хранения метки времени. Рекомендуется хранить время окончания бана (unix timestamp или DATETIME). Это упрощает проверку: если текущее время больше времени окончания - бан истёк.
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
ban_until INT DEFAULT NULL
);Поле ban_until хранит unix timestamp, до которого пользователь заблокирован. Если значение NULL - бан отсутствует.
Запись временного бана в базу данных
При наложении бана вычислите время окончания: time() + длительность_в_секундах. Например, для бана на 1 час: time() + 3600. Затем выполните SQL-запрос на обновление:
UPDATE users SET ban_until = :ban_until WHERE id = :user_idИспользуйте подготовленные выражения для защиты от SQL-инъекций.
Проверка, прошло ли время бана
При авторизации или каждом действии пользователя проверяйте поле ban_until:
- Если
ban_until IS NULL- бан не активен. - Если
ban_until <= текущее время- срок истёк, можно сбросить поле в NULL и разрешить доступ. - Если
ban_until > текущее время- пользователь всё ещё заблокирован.
Пример на PHP:
$banUntil = $user['ban_until'];
if ($banUntil !== null && $banUntil > time()) {
// пользователь заблокирован
echo 'Вы забанены до ' . date('Y-m-d H:i:s', $banUntil);
}Автоматическое снятие бана после истечения срока
Можно реализовать два подхода:
- Проверка при каждом запросе - проще и надёжнее, не требует фоновых задач.
- CRON-задача - периодически чистит истёкшие баны, но не гарантирует моментальное снятие.
Рекомендуется комбинировать: проверять при входе и сбрасывать бан, если время истекло, а CRON использовать для очистки базы от устаревших записей.
Дополнительные рекомендации
Используйте часовой пояс сервера и храните время в UTC, чтобы избежать проблем с переходом на летнее время. Для больших проектов рассмотрите хранение банов в Redis для более быстрой проверки. Также логируйте действия модераторов для аудита.