Это само по себе безвредно:
document.getElementById("demo").innerHTML = '<script src="/me.js"></script>';
HTML5 указывает, что тег, вставленный с помощью innerHTML, не должен выполняться. 1
Однако (и поскольку вы спрашиваете), может быть отдаленный шанс (по общему признанию), что это все еще может быть использовано:
// This is the backdoor that an attacker has to inject somehow
Object.defineProperty(Element.prototype, 'innerHTML', {
set: function (value) {
const script = document.createElement('script');
script.textContent = `alert('gotcha! ${value}')`;
document.body.appendChild(script);
}
});
// This is what you're doing in your app
document.getElementById("demo").innerHTML = '<script src="/me.js"><\/script>';
<div id="demo"></div>
Как видите, было бы легко разобрать и извлечь URL-адрес и заново внедрить скрипт в страницу.
В настоящее время использование innerHTML
, скорее всего, не рекомендуется.Пример:
Предупреждение. Если ваш проект будет подвергнут любой проверке безопасности, использование innerHTML, скорее всего, приведет к отклонению вашего кода.Например, если вы используете innerHTML в расширении браузера и отправляете расширение на addons.mozilla.org, оно не пройдет процесс автоматического просмотра. 1
У React есть интересный способ (IMHO) отговорить вас от его использования:
dangerouslySetInnerHTML - замена React для использования innerHTML в браузереDOM.В общем, настройка HTML из кода рискованна, потому что легко непреднамеренно подвергнуть ваших пользователей атаке межсайтового скриптинга (XSS).Таким образом, вы можете установить HTML непосредственно из React, но вы должны ввести опасно SetInnerHTML и передать объект с ключом __html, чтобы напомнить себе, что это опасно. 2
Наконец, я думаю, что стоит упомянуть, что и у epascarello, и у E. Sundin есть верная точка зрения.Мы знаем, что <script>
не будет загружаться и / или выполняться при введении через innerHTML
, но это не значит, что вы в безопасности:
<div id="demo"></div>
<script>
document.querySelector('#demo').innerHTML =
'<img src="x.gif" onerror="alert(42)">';
</script>
Ссылки
- https://developer.mozilla.org/en-US/docs/Web/API/Element/innerHTML#Security_considerations
- https://reactjs.org/docs/dom-elements.html#dangerouslysetinnerhtml