Содержание статьи

При работе с React иногда требуется отобразить готовый HTML код – например, фрагменты, полученные с сервера, встроенные виджеты или разметку, сохранённую в базе данных. Прямая вставка таких данных в JSX невозможна, поскольку React блокирует необработанный HTML для защиты от XSS-атак.
Чтобы встроить HTML в компонент, используется свойство dangerouslySetInnerHTML. Этот метод позволяет напрямую передать строку с HTML в элемент, но требует строгой проверки содержимого. Без фильтрации вставленный код может нарушить работу приложения или открыть доступ к вредоносным скриптам.
В статье рассмотрены практические способы безопасной вставки HTML, включая предварительную очистку данных, использование библиотек вроде DOMPurify и передачу HTML через props. Также приведены примеры типичных ошибок и подходы, которые помогут избежать проблем при работе с динамическим содержимым.
Использование dangerouslySetInnerHTML для вставки HTML
В React свойство dangerouslySetInnerHTML используется для рендеринга готового HTML-кода внутри компонента. Этот механизм заменяет стандартный JSX, который не допускает прямую вставку строк с HTML-разметкой. Свойство принимает объект с ключом __html, где значение – строка с HTML.
Пример базового использования:
{'
" }} />'}
React обрабатывает этот код без преобразования в JSX-элементы, напрямую вставляя HTML в DOM. Такой подход подходит для отображения контента, полученного, например, из API, файлов шаблонов или CMS.
Использовать dangerouslySetInnerHTML стоит только при полной уверенности в источнике данных. Перед вставкой HTML рекомендуется применять фильтрацию с помощью библиотеки DOMPurify или аналогов, удаляющих скрипты и потенциально опасные атрибуты. Это снижает риск внедрения вредоносного кода и защищает компонент от XSS-атак.
При работе с пользовательскими данными безопаснее генерировать элементы через JSX, а не вставлять строки с HTML. Свойство dangerouslySetInnerHTML стоит использовать только в контролируемых сценариях, где структура и содержание кода известны заранее.
Подготовка и очистка HTML перед вставкой
Перед вставкой HTML в React-компонент необходимо проверить и очистить содержимое, особенно если код поступает из внешних источников. Нефильтрованный HTML может содержать скрипты, iframe или inline-обработчики событий, способные вызвать XSS-уязвимости.
Для очистки удобно использовать библиотеку DOMPurify. Она удаляет вредоносные элементы и атрибуты, оставляя безопасную структуру разметки. Пример применения:
{'const cleanHTML = DOMPurify.sanitize(dirtyHTML);'}
Если требуется сохранить определённые теги или атрибуты, можно указать список разрешённых параметров в настройках DOMPurify. Это важно при работе с редакторами контента, где пользователи вставляют разметку с форматированием.
HTML, подготовленный вручную или сформированный сервером, также стоит проверять. Даже статические шаблоны могут содержать нежелательные теги после копирования или автогенерации. Очистка перед передачей данных в dangerouslySetInnerHTML должна быть обязательным шагом в цепочке обработки.
При частом использовании динамического HTML лучше выносить процесс фильтрации в отдельный модуль. Это упрощает поддержку кода и снижает вероятность пропуска проверки при добавлении новых источников данных.
Передача HTML через props в компонент
Иногда требуется передать HTML-код из родительского компонента в дочерний через props. Такой подход удобен, когда контент формируется динамически – например, при загрузке данных с сервера или при использовании шаблонов, хранящихся в базе данных.
Для передачи HTML достаточно передать строку в свойство компонента. В дочернем элементе эта строка рендерится через dangerouslySetInnerHTML. Пример:
{`
function HtmlBlock({ html }) {
return
}
`}
В родительском компоненте HTML передаётся как обычный проп:
{`
`}
Чтобы избежать уязвимостей, данные для props нужно предварительно очищать с помощью DOMPurify или аналогичных инструментов. Очистка должна выполняться до передачи значения в компонент, а не внутри него, чтобы исключить рендеринг вредоносного кода при повторных вызовах.
Если структура контента заранее известна, предпочтительно передавать не HTML-строку, а JSX-элементы. Это позволяет сохранить типизацию и контроль над структурой, избегая прямого обращения к DOM и снижая риск ошибок при рендеринге.
Вставка HTML из внешнего файла или API

Часто требуется загрузить HTML-код не из локальных данных, а из внешнего источника – например, из API или файла шаблона. Для этого в React используют асинхронные запросы с помощью fetch или библиотеки axios. После получения ответа HTML-строка сохраняется в состоянии компонента и рендерится через dangerouslySetInnerHTML.
Пример загрузки HTML из API:
{`
import { useEffect, useState } from "react";
function HtmlFromApi() {
const [content, setContent] = useState("");
useEffect(() => {
fetch("/data/page.html")
.then(res => res.text())
.then(data => setContent(data));
}, []);
return
}
`}
Перед вставкой важно проверять полученные данные. Если API возвращает HTML, который формируется пользователями, рекомендуется очищать содержимое через DOMPurify.sanitize() перед рендерингом.
Основные шаги при работе с внешним HTML:
| Шаг | Описание |
|---|---|
| 1 | Получить HTML через fetch или axios |
| 2 | Преобразовать ответ в текст |
| 3 | Очистить строку с помощью DOMPurify |
| 4 | Передать содержимое в dangerouslySetInnerHTML |
Такой подход подходит для статических шаблонов, контента из CMS или серверных генераторов страниц. Важно следить, чтобы запросы выполнялись только по доверенным URL и данные проходили фильтрацию перед отображением.
Использование библиотек для безопасного рендеринга HTML

При вставке HTML-кода в React важно исключить выполнение вредоносных скриптов. Для этого применяются библиотеки, которые фильтруют и преобразуют содержимое перед рендерингом. Они устраняют опасные теги, атрибуты и код, не влияя на допустимую структуру HTML.
Наиболее часто используются следующие инструменты:
- DOMPurify – очищает HTML от скриптов, inline-событий и стилей, потенциально вызывающих XSS. Поддерживает настройку разрешённых тегов и атрибутов.
- sanitize-html – позволяет задать строгие правила очистки. Подходит для серверных и клиентских приложений, поддерживает белые и чёрные списки элементов.
- react-html-parser – преобразует HTML-строку в JSX-элементы, что упрощает интеграцию с компонентами React. Поддерживает модификацию узлов и фильтрацию.
Пример работы с DOMPurify в компоненте:
{`
import DOMPurify from "dompurify";
function SafeHtml({ html }) {
const clean = DOMPurify.sanitize(html);
return
}
`}
При выборе библиотеки стоит учитывать источник данных и уровень требуемой защиты. Для клиентских приложений достаточно DOMPurify, тогда как для серверной предобработки лучше использовать sanitize-html с расширенной конфигурацией.
- Всегда очищайте данные перед передачей в dangerouslySetInnerHTML.
- Не храните HTML без фильтрации, даже во внутренней базе данных.
- Тестируйте фильтры на выборках пользовательского контента, чтобы убедиться, что допустимые элементы не удаляются.
Рендеринг HTML с помощью React Hooks
React Hooks позволяют динамически управлять состоянием HTML-контента и контролировать его рендеринг. Чаще всего используют useState для хранения строки с HTML и useEffect для её загрузки или обновления из внешнего источника.
Пример динамического рендеринга:
{`
import { useState, useEffect } from "react";
import DOMPurify from "dompurify";
function HtmlRenderer({ url }) {
const [html, setHtml] = useState("");
useEffect(() => {
fetch(url)
.then(res => res.text())
.then(data => setHtml(DOMPurify.sanitize(data)));
}, [url]);
return
}
`}
Использование useEffect гарантирует, что HTML загружается асинхронно и обновляется только при изменении источника. useState позволяет хранить очищенный контент, чтобы избежать повторной фильтрации при каждом рендере.
При работе с Hooks важно помнить:
- Фильтровать HTML до установки в состояние.
- Обновлять контент только при изменении URL или входных данных.
- Не использовать dangerouslySetInnerHTML для незнакомого или непроверенного HTML без очистки.
Такой подход повышает контроль над рендерингом, обеспечивает безопасность приложения и упрощает интеграцию динамического контента в React-компоненты.
Частые ошибки при вставке HTML и как их избежать

Другой распространённой ошибкой является вставка HTML, содержащего недопустимые теги или атрибуты, что может нарушить структуру DOM и вызвать ошибки рендеринга.
Типичные проблемы и рекомендации по их решению:
- Вставка необработанного HTML от пользователей: всегда фильтруйте данные с помощью DOMPurify или sanitize-html.
- Неправильное использование JSX и HTML одновременно: избегайте смешивания JSX-тегов с HTML-строкой, используйте dangerouslySetInnerHTML для целостных блоков.
- Повторная очистка контента на каждом рендере: храните очищенный HTML в состоянии через useState или переменную, чтобы не выполнять фильтрацию повторно.
- Отсутствие контроля источника данных: загружайте HTML только с доверенных API или файлов, проверяйте URL и параметры запроса.
Соблюдение этих правил позволяет вставлять HTML безопасно и предотвращает ошибки, связанные с нарушением структуры DOM и угрозами безопасности.
Вопрос-ответ:
Как безопасно вставить HTML в React компонент?
Для вставки HTML в React используют свойство dangerouslySetInnerHTML. Перед передачей кода необходимо очистить его с помощью библиотеки DOMPurify или аналогичной, чтобы удалить скрипты и опасные атрибуты. После очистки HTML передаётся в компонент через объект с ключом __html, что позволяет рендерить разметку напрямую в DOM.
Можно ли вставлять HTML, полученный от пользователей?
Вставлять HTML от пользователей напрямую небезопасно. Любой ввод необходимо фильтровать, чтобы исключить скрипты, iframe и обработчики событий. Для этого используют библиотеки вроде DOMPurify, которые оставляют только разрешённые теги и атрибуты, предотвращая XSS-атаки.
Как передать HTML в дочерний компонент через props?
HTML-код можно передать через props как строку. В дочернем компоненте эта строка рендерится через dangerouslySetInnerHTML. Перед передачей данные следует очистить, чтобы исключить вредоносные элементы. Такой подход позволяет динамически изменять контент в разных компонентах приложения.
Можно ли загружать HTML из внешнего файла или API?
Да, HTML можно загружать с сервера через fetch или axios. После получения строки её следует очистить с помощью DOMPurify и сохранить в состоянии компонента через useState. Затем HTML рендерится через dangerouslySetInnerHTML, что позволяет безопасно отображать контент из внешнего источника.
Какие ошибки чаще всего допускают при вставке HTML в React?
Частые ошибки включают: вставку необработанного HTML без фильтрации, смешивание JSX и HTML, повторную очистку контента на каждом рендере и использование недоверенных источников. Чтобы избежать проблем, следует очищать HTML заранее, хранить его в состоянии и проверять источник данных перед вставкой в компонент.
Как правильно вставить HTML-код в React компонент, чтобы избежать ошибок и угроз безопасности?
Для вставки HTML в React используют свойство dangerouslySetInnerHTML, которое принимает объект с ключом __html и строкой HTML. Перед передачей кода его обязательно нужно очищать с помощью библиотек вроде DOMPurify, чтобы удалить скрипты, inline-обработчики и опасные атрибуты. Для динамического контента удобнее хранить очищенный HTML в состоянии через useState, а при загрузке с сервера или файла использовать useEffect для асинхронного обновления. Если контент генерируется пользователями, фильтрация обязательна, а при известной структуре HTML безопаснее формировать JSX-элементы вместо вставки строк с разметкой.
