В вашем вопросе два разных предложения.
... если можно указать браузеру только выполнить код JS, который
находится в тегах при начальной загрузке страницы
Тогда вы предотвратите разбиение кода и заставите всех связывать полные сценарии. Также есть document.head.appendChild(...)
, где child = document.createElement("script")
- эта функциональность как бы создает скрипт для "начальной загрузки страницы" прямо в <head/>
. Во многих отношениях это плохая идея, чтобы предотвратить добавление скриптов в DOM документа.
теги, которые были вставлены динамически
... это другое предложение. Если вы говорите, что браузер все еще позволяет JS создавать теги script
из кода, но el.innerHTML
вообще не должен разрешать тег script
, это не может быть слишком ограничивающим для некоторых случаев. Вы можете достичь этого, например, переопределив Element.prototype
innerHTML. Это все еще плохая идея, но может помочь предотвратить определенную атаку.
Пример кода в принятом ответе здесь:
Изменение внутреннего HTML, установленного на лету
По сути, вы бы сделали:
var originalSet = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML').set;
Object.defineProperty(Element.prototype, 'innerHTML', {
set: function (value) {
// change it (ok)
var new_value = value.toString().replace(/<script/g,"");
//Call the original setter
return originalSet.call(this, new_value);
}
});
Это не очень надежно, и я бы не использовал его в производстве. Но я могу предположить, что это может помочь обнаружить проблему со сторонним скриптом.