Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
HTML и DOM предлагают множество возможностей для атак, которые слишком сложные или медленные для React или других библиотек пользовательского интерфейса.— пошёл читать оригинал. Перевод адовейший. Тем не менее, спасибо автору уже за ссылку на исходную статью.
Проверка идет на уровне html-элемента, а не атрибута. Например, есть JSX:
<div dangerouslySetInnerHTML={{__html: '<b>Hello!</b>'}} />Из него получается вот такой js-объект:
{
type: "div",
$$typeof: Symbol(react.element),
key: null,
props: {
dangerouslySetInnerHTML: { __html: "<b>Hello!</b>" }
}
// ...
}Как видим, на нем есть $$typeof на уровне div, и идет его проверка.
То есть вот такая атака все еще возможна:
const evilProps = {
dangerouslySetInnerHTML: { __html: "<b>Hello!</b>" }
};
<div {...evilProps} />В оригинальной статье была ссылка на соответствующую issue на Github, но она куда-то потерялась у переводчика.
Увы, они не получают эту дополнительную защиту. React по-прежнему включает в себя $$typeof для элемента для согласованности, но он установлен в число — 0xeac7.
Случайное число не сможет быть расшарено между несколькими инстансами React. Цитата из статьи:
И даже если на странице имеется несколько копий React, они все равно смогут «солгасоваться» через единое значение $$typeof.
Если число будет случайное, такой сценарий работать не будет
Почему у React элементов есть свойство $$typeof?