Вопрос: «Кто ты?»
Субъект сообщает свое уникальное системное имя (логин, email, табельный номер).
SELECT id FROM users WHERE login = :login;
Вопрос: «Докажи это!»
Проверка подлинности через секрет (хэш пароля, криптографическая соль, OTP-код из SMS).
verify_hash(input_pwd, salt, db_hash);
Вопрос: «Что тебе можно?»
Проверка прав и ролевых полномочий (RBAC) к модулям, таблицам и операциям базы данных.
IF role = 'Admin' THEN GRANT ACCESS;
id (PK) — первичный ключ.role_name — уникальное имя роли (NOT NULL, UNIQUE).role_description — текстовое описание полномочий.id (PK) — суррогатный ключ (BIGINT).login — уникальный логин (UNIQUE).salt — криптографическая соль.password_hash — хэш-образ пароля.role_id (FK) — внешняя ссылка.is_active — флаг мягкой блокировки.id (PK) — ключ события.user_id (FK) — субъект действия.attempted_login — имя попытки.event_type — SUCCESS / FAILURE.ip_address — адрес терминала.event_time — точная метка времени.CREATE TABLE roles (
id SERIAL PRIMARY KEY,
role_name VARCHAR(50) NOT NULL UNIQUE,
role_description VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL
);
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
login VARCHAR(50) NOT NULL UNIQUE,
salt VARCHAR(64) NOT NULL,
password_hash VARCHAR(128) NOT NULL,
role_id INTEGER NOT NULL,
is_active BOOLEAN DEFAULT TRUE NOT NULL,
failed_attempts SMALLINT DEFAULT 0 NOT NULL,
locked_until TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT fk_users_roles FOREIGN KEY (role_id)
REFERENCES roles(id) ON UPDATE CASCADE ON DELETE RESTRICT
);
SHA256("admin123") = 240be518fabd2724...Hash(password + salt).VARCHAR(64)).VARCHAR(60)).$2b$[cost]$[salt22][hash31].CREATE TABLE audit_logs (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT,
attempted_login VARCHAR(50) NOT NULL,
event_type VARCHAR(30) NOT NULL,
ip_address VARCHAR(45) NOT NULL,
user_agent VARCHAR(255),
event_time TIMESTAMP WITH TIME ZONE
DEFAULT CURRENT_TIMESTAMP NOT NULL,
details TEXT,
CONSTRAINT fk_audit_users
FOREIGN KEY (user_id)
REFERENCES users(id)
ON DELETE SET NULL
);
CREATE INDEX idx_audit_time
ON audit_logs(event_time);
user_id может быть NULL, если логин не найден в базе, но attempted_login сохраняется всегда!VARCHAR(45) гарантирует хранение как IPv4, так и длинных адресов IPv6.LOGIN_SUCCESS, LOGIN_FAILURE, PASSWORD_RESET, LOCKOUT.event_time необходим для оперативного мониторинга инцидентов.IDLE — ожидание ввода учетных данных.CLIENT_VALIDATION — проверка формата логина и непустого пароля.SUBMITTING — блокировка кнопки, вызов API.AUTH_ERROR — нейтральная ошибка, сброс пароля.SUCCESS — переход к рабочему месту роли.Сообщение 1: «Пользователь с таким логином не существует»
Сообщение 2: «Введен неверный пароль к логину admin»
Уязвимость: Злоумышленник по сообщению понимает, существует ли аккаунт, и собирает базу валидных логинов компании!
Единое нейтральное сообщение:
«Неверный логин или пароль»
Злоумышленник не получает информации о наличии пользователя в базе данных.
Дополнительно: задержка ответа одинакова для существующих и несуществующих аккаунтов (защита от Timing-атак).
UPDATE users
SET failed_attempts = failed_attempts + 1,
locked_until = CASE
WHEN failed_attempts + 1 >= 5
THEN NOW() + INTERVAL '15 minutes'
ELSE NULL
END
WHERE login = :login;
failed_attempts = 0 при успешном входе.Роли: Кладовщик, Менеджер, Бухгалтер, Администратор.
Особенность входа: выбор филиала/склада из выпадающего списка при авторизации; изоляция видимости номенклатуры.
Роли: Врач, Регистратор, Главврач.
Особенность входа: вход по табельному номеру врача + второй фактор (2FA / TOTP-код) для доступа к электронным картам.
Роли: Оператор, Кредитный инспектор, Контролер.
Особенность входа: виртуальная цифровая экранная клавиатура с рандомизацией клавиш (защита от клавиатурных шпионов).
Роли: Студент, Преподаватель, Куратор, Родитель.
Особенность входа: защищенный сценарий «Забыли пароль» с генерацией одноразовой криптографической ссылки сброса.
zanyatie.html, ввести свою фамилию и учебную группу.users, roles, audit_logs с обязательными полями (salt, password_hash, role_id, is_active).Структура таблиц безопасности
salt, password_hash, is_active.Макет формы входа (Login Dialog)
Выводы и самопроверка
Robert'); DROP TABLE Students; --. Когда школа вставила имя ученика в базу через простую конкатенацию строки, база данных стерла всех студентов за учебный год. На этапе проектирования проекта БД и формы входа важно помнить: строгая валидация полей входа, параметризованные запросы и хранение хэшированных паролей с солью исключают подобные катастрофы!