7 сентября 2022 г. (изменено: 11 сентября 2022 г.)

Канал: @cherkashindev

419

XSS в React

Одним из самых больших преимуществ реакта является его безопасный дизайн, который предотвращает появление большинства XSS (Cross-Site-Scripting) уязвимостей.

Может показаться что, если вы используете реакт, то вы в безопасности, ведь: ● React по-умолчанию экранирует текст, перед тем как его отрендерить ● dangerouslySetInnerHTML не позволяет рендерить тэг script и просто удаляет его

Однако это не так. В реакт всё ещё существуют способы эксплуатации XSS уязвимостей.

1️⃣ JavaScript URL - href аттрибут В реакте всё ещё возможно использовать javascript: схему вместо http: и https: для эксплуатации XSS. Например, если приложение позволяет вводить URL, то пользователь может ввести следующий адрес javascript:alert('XSS') . В таком случае указанный javascript код будет выполнен, когда пользователь попытается перейти по ссылке. Поэтому очень важно валидировать полученный url.

2️⃣ dangerouslySetInnerHTML В данном случае имя свойства говорит само за себя. Несмотря на то, что оно не позволяет рендерить тэг script, есть множество иных способов эксплуатации XSS с помощью этого поля. Один из самых простых примеров - использование тэга img вместе с onerror. Больше примеров можно найти здесь. Поэтому свойство dangerouslySetInnerHTML должно использоваться в связке с библиотекой DOMPurify для предотвращения XSS.

3️⃣ Native API Если по каким-то причинам, вам необходимо использовать нативный API браузера, то в данном случае важно быть в двойне осторожным, ведь тут реакт уже не поможет: ● Постарайтесь использовать innerText вместо innerHTML ● Вы все также можете использовать библиотеку DOMPurify

Чтобы подробнее ознакомиться с предотвращением XSS уязвимостей в React приложении советую прочитать следующий цикл статей: ● Preventing XSS in React (Part 1): Data binding and URLsPreventing XSS in React (Part 2): dangerouslySetInnerHTMLPreventing XSS in React (Part 3): escape hatches and component parsers