Pull to refresh

Comments 16

статья хорошая, но перевод слабоват: сильно чувствуется калька с английского. я прям вижу английский текст и постоянно крутится мысль «по-русски так не говорят»
Плюсую. После этого:
HTML и DOM предлагают множество возможностей для атак, которые слишком сложные или медленные для React или других библиотек пользовательского интерфейса.
— пошёл читать оригинал. Перевод адовейший. Тем не менее, спасибо автору уже за ссылку на исходную статью.
обновил, постарался учесть замечания
Спасибо за статью, только непонятно что под капотом у dangerouslySetInnerHTML, там все-таки выполняется innerHTML, а потом уже проверяется наличие и значение поля $$typeof?
UFO just landed and posted this here
хм… а на каком тогда этапе идет проверка $$typeof?

Проверка идет на уровне 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.

Но ведь тогда его можно передать через уязвимость? Почему они не выставляют его в случайное число, которое генерируется при запуске страницы каждый раз?
Это число не несет в себе никаких функций безопасности, оно просто добавлено для того, что-бы там было хоть какое-то значение. Вероятнее всего, в случае генерации случайного числа, возникнут проблемы согласования между несколькими копиями реакта.
Не понимаю. Вся статья говорит, что это значение нужно для безопасности, а вы говорите противоположное.

Все остальные копии Реакта могут использовать значение из первой копии. Ну или оно может генерироваться на базе какой-то информации компьютере (разрешение экрана + юзерагент) и другие данные для Fingerprint'а
Альтернативные решения смахивают на оверинжиниринг для этой задачи. Уязвимость в безопасности не настолько серьезная, чтобы заморачиваться с фингерпринтингом для одного единственного браузера, который и так скоро отомрет.

Случайное число не сможет быть расшарено между несколькими инстансами React. Цитата из статьи:


И даже если на странице имеется несколько копий React, они все равно смогут «солгасоваться» через единое значение $$typeof.

Если число будет случайное, такой сценарий работать не будет

Вообще не вижу проблем с этим, см. выше.
UFO just landed and posted this here
Не уверен, что полифил будет корректно работать в разных фреймах
Sign up to leave a comment.

Articles