Каковы плюсы и минусы использования пакета синтаксического анализа HTML, такого как html-react-parser vs dangerouslySetInnerHTML в React

#reactjs #html-parsing #dangerouslysetinnerhtml #html-react-parser

#reactjs #html-синтаксический анализ #dangerouslysetinnerhtml #html-react-parser

Вопрос:

У нас есть база данных, содержащая HTML-код, и мы отображаем его на веб-странице с помощью React, но его необходимо проанализировать.

Первоначально я использовал html-react-parser, но после проверки кода было предложено использовать dangerouslySetInnerHTML вместо этого, потому что у него нет никаких зависимостей.

Я не смог сформулировать какие-либо преимущества использования html-react-parser, кроме того, что он не использует dangerouslySetInnerHTML, но является ли это преимуществом, и если да, то почему? Это каким-то образом избегает опасностей или они просто скрыты?

Большое спасибо,

Кэти

Ответ №1:

Недавно я изучал эту проблему для проекта Headless CMS, над которым я работаю. Из того, что я понимаю:

dangerouslySetInnerHtml создает элементы DOM вне ReactDOM.Render() метода, поэтому он не поддерживается динамически библиотекой React. Это в основном противоречит цели использования React в первую очередь (отображение и поддержка виртуального DOM).

Более тревожным, однако, является то, что он уязвим для межсайтовых скриптовых (XSS) атак, откуда он и получил свое название. Это очень распространенная форма атаки в Интернете. Вы можете прочитать об этом здесь: https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml

Если вы хотите, чтобы приложение было менее подвержено атакам, вам придется использовать библиотеку очистки, например DOMPurify for dangerouslySetInnerHtml , так что в любом случае у вас, вероятно, будет другая зависимость. После компиляции приложения для production ( npm build ) процесс минимизации делает кодовую базу чрезвычайно компактной, и вы можете заранее выполнить некоторую оптимизацию с помощью таких методов, как разделение кода, что позволяет загружать каждый раздел вашей страницы только по запросу, а не все сразу: https://reactjs.org/docs/code-splitting.html

Лично я бы не стал слишком беспокоиться о нескольких зависимостях — они являются фактом жизни в современном Интернете. Я склонялся к использованию html-react-parser , но я предупреждаю, что, сказав, что я не исследовал, уменьшает ли это уязвимость XSS. Однако, даже если оба они уязвимы для атак XSS, по крайней html-react-parser мере, вводит элементы, ReactDOM.render() чтобы они не превращали DOM в catty-wompus — это звучит как рецепт катастрофы в будущем.

Комментарии:

1. Я понимаю, что вы ответили на это много месяцев назад, но я только что заметил ваш ответ. Большое вам спасибо — я ценю ваш подробный ответ!

2. Абсолютно. На самом деле, я рад, что вы напомнили мне об этом, потому что в настоящее время я работаю над проектом, который использует его снова, и я забыл об этом ответе, так что все получилось отлично.