Comments 13
Вы приводите подобный пример небезопасного кода.
<script>window.__STATE__ = ${JSON.stringify({ data })}</script>
Допустим даже у нас вот такой стейт:
{ username: "pwned", bio: "</script><script>alert('XSS Vulnerability!')</script>" }
В чем тут проблема? Даже если какой-то из моих компонентов будет делать что-то подобное:
return (
<div>{ state.bio }</div>
);
Данное значение все равно будет выведено как текст, а не как html-код. Т.е. "зловредный" скрипт не будет выполнен. Если же речь о чем-то вроде:
div.innerHTML = state.bio;
То React уже здесь не при чем.
| Уязвимость №3: непонимание смысла конструкции dangerouslySetInnerHtml
Не знаю как Вы, но я в своих проектах ещё не встречал использования dangerouslySetInnerHtml
, так что не уверен, что это типичная ошибка.
Поддерживаю вопрос, совершенно не понятно что автор имел ввиду. Сначала я подумал, что перевод кривой, посмотрел в оригинал — там такое же мутное описание.
Вообще складывается впечатление, что ru_vsd переводит весь шлак подряд. Иногда встречаются статьи-бриллианты, но какого-то предварительного отсева явно не хватает.
Речь идет про такой код
<script>
const json = JSON.parse('{"text":"</script><script>alert(1)</script>" }')
...
Если вы храните экранированные данные в базе, то у вас нет проблем. Но я не храню и не буду.
Замечательно. Только что с этим кодом не так? Я только что его выполнил в консоли и ничего ужасного не произошло, кроме создания переменной json
. Что дальше такого страшного должен сделать "типовой" react-разработчик, чтобы это привело к каким-то нежелательным последствиям? Еще раз отмечу, что действия вроде
div.innerHTML = json.text;
никакого отношения к React не имеют.
npm i express
node server.js
После этого перейдите на localhost:3000
div.innerHTML = json.text
за вас при этом делает шаблонизатор строк
В заголовке статьи написано
Три типовых ошибки в сфере безопасности, о которых должен знать каждый React-разработчик
Я еще раз повторю на всякий случай — при чем тут React? То, что Вы привели как пример не является проблемой React'а, а самая что ни на есть обычная code-injection (во всем "проверочном" проекте нет ни одной ссылки на React). Единственное, что связывает его с React'ом это то, что такой подход может решить использовать разработчик, который хочет задать исходное состояние для Redux, который вроде как часто используют и с React. До React'а дело и не доходит, а если бы дошло, то там уже никаких проблем бы не было (подобный JSX ни к каким проблемам не приведет <input value={ json.input } />
).
Сохраните html и откройте как html. Тем что это выведет alert()
Потому что браузеру плевать, что JS не закончился. Он видит
Три типовых ошибки в сфере безопасности, о которых должен знать каждый React-разработчик