Рано или поздно кто-то из нас всегда будет задаваться вопросом, почему скрипт, который вы добавили с помощью dangerouslySetInnerHTML
, не запускается. Не нужно больше этому удивляться. Вот чем я хочу с вами поделиться сегодня.
dangerouslySetInnerHTML
находится в конце свойства HTML-элемента innerHTML
, которое используется для получения или установки разметки HTML / XML, содержащейся в элементе.
Использование innerHTML
- не лучшая практика, поскольку это делает ваше приложение уязвимым для атак XSS (межсайтовый скриптинг), и именно по этой причине React специально назвал его как dangerouslySetInnerHTML
, напоминая нам, что его использовать опасно. Кроме того, вы можете передать разметку, добавив ее в качестве значения ключа__html
в объект, чтобы случайно не передать что-то ему.
const getMarkup = () => ({ __html: "<h1>Hey There!</h1>" }); <div dangerouslySetInnerHTML={getMarkup()} />
Теперь перейдем к делу, innerHTML
не принимает скрипты. Допустим, вы добавили скрипт,
const getMarkup = () => ({ __html: "<script>alert('I will not be executed')</script>" }); <div dangerouslySetInnerHTML={getMarkup()} />
он не будет выполнен. HTML5 указывает, что тег <script>
, вставленный с innerHTML
, не должен выполняться.
Однако есть способы выполнить JavaScript без использования тегов <script>
, поэтому все еще существует угроза безопасности всякий раз, когда вы используете innerHTML
для установки строк, над которыми вы не можете контролировать.
Так что да, неудачное выполнение сценария с dangerouslySetInnerHTML
является ожидаемым поведением, и, как следует из названия, помните, что это опасно в следующий раз, когда вы подумаете о его использовании.