Comments
выглядит как будто React-разработчики наступают последовательно на все грабли PHPшников, рендеря небезопасные данные прямо во фронте, уже пора вводить аналог magic_quotes_gpc в реакт?
Ну… не знаю, может мой опыт слишком специфичен, но я не сталкивался с описанными уязвимостями…

1) сервеный рендеринг — каюсь, не использовал, не было нужды. Про опцию в курсе, но пока не пригодилось. Единственное, что пару раз нужно было — пререндеринг, но там нет стейта, только страница как точка входа, поэтому нет и граблей.

2) ссылки «javascript:» — с пользовательскими url встречался только при загрузке ресурсов на сервер, а там протокол «javascript:» для хацкеров бесполезен.

3) dangetousSetInnerHtml — всегда жёстко и бесповоротно забанен в проектах с самого начала реакта, ещё даже когда линтеров толком не было :) Меня пытать надо, чтоб это через ревью пропихнуть.

В целом, информация полезная. Но по-моему, проекты реакта с подобными уязвимостями на массовость не тянут, поэтому ситуация значительно лучше пхп 6-7-летней давности. Про современный пхп я уже ничего не знаю.
А что не так с dangetousSetInnerHtml, если на сервере данные экранируются и оттуда удаляется всё подозрительное? Как wysiwyg делать?
Для wysiwig dangerousSetInnerHtml хорош, но в тех проектах что я учавствовал, редакторы жили в отдельном проекте, обычно в пакете из npm. Поэтому именно в прикладных проектах dangetousSetInnerHtml забанен линтером.
Все-таки правильно «типичных» (ошибки). Типовой может быть дом, застройка, в смысле шаблонной. А типичный это «свойственный» для кого-то или чего-то.

Вы приводите подобный пример небезопасного кода.


<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 не имеют.

Попробуйте сохранить в server.js содержимое pastebin.com/GVHvwpk1 после чего установить в папку express и выполните

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 не закончился. Он видит

и закрывает script. А дальше можно написать любой скрипт. Именно поэтому ошибка такая опасная… ее не видят.
Only those users with full accounts are able to leave comments. Log in, please.