Какие браузерные уязвимости существуют и как с ними бороться
Что проверяют
Понимаете ли вы, какие атаки касаются именно фронтенда и какие механизмы браузера от них защищают, а не только перечень аббревиатур. Следом обычно просят объяснить, как работает CSP, или спрашивают, почему SameSite не отменяет CSRF-токены полностью.
Как отвечать
Идите от атаки к защите:
- XSS: чужой скрипт исполняется в контексте вашего origin. Бывает хранимый, отражённый и DOM-based. Защита: экранирование при выводе (React экранирует текст в JSX сам, опасны
dangerouslySetInnerHTML,innerHTMLи ссылкиjavascript:), санитизация HTML через DOMPurify, строгий CSP с nonce или hash и безunsafe-inline, Trusted Types; - CSRF: браузер сам прикладывает куки к запросу, отправленному с чужого сайта. Защита: атрибут
SameSite(Chrome считает куку без атрибутаLax), CSRF-токены, проверка заголовкаOrigin, изменение состояния только запросами POST, PUT, PATCH и DELETE, а не GET; - кража сессии: токен в
localStorageдоступен любому внедрённому скрипту. Сессионная кука сHttpOnly,SecureиSameSiteскрипту недоступна; - clickjacking: ваш сайт открывают в невидимом iframe и заставляют кликнуть. Защита: директива
frame-ancestorsв CSP илиX-Frame-Options; - ошибки CORS: сервер, который отражает любой
Originвместе сAccess-Control-Allow-Credentials: true, открывает API всем сайтам сразу; - атаки через зависимости: уязвимый или подменённый npm-пакет. Помогают lock-файл,
npm audit, автоматические обновления зависимостей и SRI для скриптов с CDN.
Закончите мыслью, что защита многослойная: CSP не заменяет экранирование, а страхует на случай, когда его где-то пропустили.
Где спотыкаются
Считают CORS защитой от атак. CORS ослабляет same-origin policy для чтения ответов, а сам запрос всё равно уходит на сервер, так что от CSRF он не спасает.
Говорят, что React полностью закрывает XSS. Он экранирует только текст, а dangerouslySetInnerHTML, href из пользовательских данных и прямая работа с DOM остаются дырами.
Называют «валидацию ввода» главной защитой от XSS. Решает контекстное экранирование при выводе: одна и та же строка безопасна в тексте и опасна внутри атрибута или скрипта.