Какие атаки возможны на форму авторизации и как защитить пользователей?
Что проверяют
Видите ли вы форму входа глазами атакующего целиком, а не только SQL-инъекцию из учебника. Следом почти всегда спрашивают, как вы храните пароли и как ограничиваете перебор в своём фреймворке.
Как отвечать
Разложите атаки по группам и к каждой приложите защиту на Python-стеке:
- перебор и credential stuffing: подбор паролей и прогон утёкших пар логин/пароль. Защита: лимит попыток по аккаунту и по IP (
django-axes,slowapiдля FastAPI, счётчики в Redis), капча после нескольких неудач, проверка пароля по базам утечек при регистрации; - перечисление пользователей: разные ответы «нет такого логина» и «неверный пароль» или разное время ответа. Отвечайте одной фразой и считайте хэш даже для несуществующего логина;
- SQL-инъекция: параметризованные запросы, ORM Django или SQLAlchemy, никаких f-строк в
cursor.execute; - кража и фиксация сессии: куки с флагами
HttpOnly,Secure,SameSite, только HTTPS с HSTS, новый идентификатор сессии после входа. Django делает это сам вlogin(), в самописном коде про это забывают; - CSRF и XSS: CSRF-токен нужен и на форме входа (login CSRF), плюс экранирование в шаблонах и заголовок
Content-Security-Policy; - утечка базы: пароли хранятся медленным хэшем с солью (Argon2id, bcrypt или PBKDF2, который Django использует по умолчанию), секреты сравниваются через
hmac.compare_digest.
Сверху второй фактор: TOTP (pyotp) или passkeys. SMS допустим, но это самый слабый вариант из-за перехвата и перевыпуска SIM.
Где спотыкаются
Предлагают hashlib.sha256(password) или шифрование паролей. Быстрый хэш перебирается на видеокарте, а зашифрованный пароль расшифруют, если вместе с базой утёк ключ.
Ограничивают попытки только по IP. Credential stuffing идёт с тысяч адресов ботнета, поэтому нужен лимит и по аккаунту, но без вечной блокировки: иначе любой может запереть чужую учётную запись.
Перечисляют атаки без защиты и забывают про перечисление пользователей, в том числе на форме восстановления пароля. Интервьюеру важна пара «угроза и конкретная мера», а не список терминов.