React·100 вопросов

Когда использовать dangerouslySetInnerHTML и как делать это безопаснее?

Ответ

Необходимость использования метода dangerouslySetInnerHTML в React возникает редко, но в ряде случаев без него обойтись действительно невозможно. Например, это требуется при отображении сгенерированного из Markdown контента, богатых текстовых редакторов или сложных CMS-документов, содержащих разметку.

Первым шагом к безопасной работе с этим методом является четкое осознание потенциальных рисков внедрения кода. Применяйте его исключительно для работы с доверенными источниками данных или контентом, который прошел предварительную глубокую обработку и очистку на сервере.

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

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

Категорически избегайте внедрения любых инлайн-скриптов, таких как теги script или обработчики событий вроде onclick прямо в разметке. Даже после санитизации такие конструкции могут нести угрозу безопасности и нарушать строгие политики безопасности вашего приложения.

На уровне веб-сервера обязательно настраивайте Content Security Policy заголовки, которые запрещают выполнение встроенных скриптов. Это создаст дополнительный уровень защиты, который сработает, даже если вредоносный код случайно попадет в отрисовываемый HTML-контент.

Полезен ли этот ответ?

Другие вопросы этой темы

Связанные вопросы из других тем