Выбор ответа Middle Безопасность фронтенда обновлено

Где React не спасает от XSS

Вопрос

bio приходит от пользователя. Какой фрагмент React-кода уязвим к XSS?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: <div dangerouslySetInnerHTML={{ html: bio }} /. React экранирует значения в тексте и атрибутах, поэтому {bio} в абзаце, value, title и aria-label безопасны: разметка выводится как текст. dangerouslySetInnerHTML вставляет строку как HTML без проверки, и <img src=x onerror=... выполнится.

Варианты ответа

  1. <p className="bio">{bio}</p>
  2. <div dangerouslySetInnerHTML={{ __html: bio }} />правильный ответ
  3. <input type="text" value={bio} readOnly />
  4. <p title={bio} aria-label={bio}>Текст</p>

Разбор

React экранирует значения в тексте и атрибутах, поэтому {bio} в абзаце, value, title и aria-label безопасны: разметка выводится как текст. dangerouslySetInnerHTML вставляет строку как HTML без проверки, и <img src=x onerror=...> выполнится. Если HTML от пользователя действительно нужен, его прогоняют через санитайзер (DOMPurify). Ещё одно место, где React не помогает: пользовательский URL в href, протокол нужно проверять самому.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме