Выбор ответа Middle Безопасность бэкенда обновлено
Сравнение секретов
Вопрос
Сервис проверяет подпись вебхука: if (signature === expected). В чём риск и чем заменить?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Атака по времени; заменить на crypto.timingSafeEqual. Обычное сравнение строк прерывается на первом отличающемся символе.
Варианты ответа
- Риска нет,
===сравнивает строки за постоянное время - Нужно
==вместо===, чтобы не зависеть от типа - Атака по времени; заменить на
crypto.timingSafeEqualправильный ответ - Нужно сравнивать через
localeCompareс локалью
Разбор
Обычное сравнение строк прерывается на первом отличающемся символе. Измеряя время ответа, можно подбирать подпись по символу. timingSafeEqual сравнивает за время, не зависящее от содержимого. Буферы должны быть одной длины, иначе он бросит ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH, поэтому длину проверяют заранее.
===не гарантирует постоянного времени.==иlocaleCompareведут себя так же или хуже.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Термины по теме
Ещё по теме «Безопасность бэкенда»
- Безопасный INSERT: параметры и белый список колонок
- CORS: проверка Origin по белому списку
- Проверка claims JWT после подписи
- deepMerge без prototype pollution
- Rate limiter на token bucket
- Кто превысил лимит запросов: скользящее окно
- Код-ревью: регистрация, вход и сброс пароля
- Как защитить Node.js API