Comments 16
статья хорошая, но перевод слабоват: сильно чувствуется калька с английского. я прям вижу английский текст и постоянно крутится мысль «по-русски так не говорят»
+1
Плюсую. После этого:
HTML и DOM предлагают множество возможностей для атак, которые слишком сложные или медленные для React или других библиотек пользовательского интерфейса.— пошёл читать оригинал. Перевод адовейший. Тем не менее, спасибо автору уже за ссылку на исходную статью.
0
Спасибо за статью, только непонятно что под капотом у dangerouslySetInnerHTML, там все-таки выполняется innerHTML, а потом уже проверяется наличие и значение поля $$typeof?
0
UFO just landed and posted this here
хм… а на каком тогда этапе идет проверка $$typeof?
0
Проверка идет на уровне 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, но она куда-то потерялась у переводчика.
+1
Увы, они не получают эту дополнительную защиту. React по-прежнему включает в себя $$typeof для элемента для согласованности, но он установлен в число — 0xeac7.
Но ведь тогда его можно передать через уязвимость? Почему они не выставляют его в случайное число, которое генерируется при запуске страницы каждый раз?
+2
Это число не несет в себе никаких функций безопасности, оно просто добавлено для того, что-бы там было хоть какое-то значение. Вероятнее всего, в случае генерации случайного числа, возникнут проблемы согласования между несколькими копиями реакта.
+1
Не понимаю. Вся статья говорит, что это значение нужно для безопасности, а вы говорите противоположное.
Все остальные копии Реакта могут использовать значение из первой копии. Ну или оно может генерироваться на базе какой-то информации компьютере (разрешение экрана + юзерагент) и другие данные для Fingerprint'а
Все остальные копии Реакта могут использовать значение из первой копии. Ну или оно может генерироваться на базе какой-то информации компьютере (разрешение экрана + юзерагент) и другие данные для Fingerprint'а
0
Случайное число не сможет быть расшарено между несколькими инстансами React. Цитата из статьи:
И даже если на странице имеется несколько копий React, они все равно смогут «солгасоваться» через единое значение $$typeof.
Если число будет случайное, такой сценарий работать не будет
+1
Sign up to leave a comment.
Почему у React элементов есть свойство $$typeof?