#javascript #html #ejs #content-security-policy
#javascript #HTML #ejs #контент-безопасность-политика
Вопрос:
Я пытаюсь запустить javascript во внешнем файле на странице HTML / EJS. Код выглядит следующим образом:
<body onload="initialize()">
//HTML content
<script src="/public/js/gallery.js"</script>
</body>
Функция «initialize()» находится в «gallery.js «досье. Проблема в том, что я постоянно получаю сообщение об ошибке, которое гласит:
«Отказано в выполнении встроенного скрипта, поскольку он нарушает следующую директиву политики безопасности содержимого: «script-src ‘self'». Для включения встроенного выполнения требуется либо ключевое слово ‘unsafe-inline’, либо хэш (‘sha256-tPMkUWbNPBXQQ3rlbFhILb35szR89eQb3Z41bzLr wQ=’), либо одноразовый номер (‘одноразовый номер-…’).»
Я попробовал несколько попыток исправления в моем теге «head» на странице. К ним относятся «<meta Content-Security-Policy: script-src ‘self’ ‘unsafe-inline'»>», «Content-Security-Policy: script-src ‘self'» и «meta http-equiv=»content-security-policy content=script-src»…
Это сводит с ума…Я потратил несколько часов, пытаясь исправить это. Может кто-нибудь, ПОЖАЛУЙСТА, дать какое-нибудь объяснение, в чем проблема …??? Я заранее благодарю вас. С уважением.
‘gallery.js ‘ файл выглядит следующим образом:
addEventListener("load", initialize);
function initialize() {
//do stuff
}
Комментарии:
1. Этот тег скрипта поврежден. В открывающем теге отсутствует его закрывающий>
Ответ №1:
Решение этой проблемы путем отключения правила CSP, запрещающего встроенные скрипты, не является хорошей идеей. Встроенные скрипты являются основным вектором для XSS-атак.
Вместо этого удалите встроенный скрипт и поместите эквивалентную функциональность в сам .js
файл.
Удалить onload="initialize()"
из HTML-кода.
Добавьте addEventListener("load", initialize)
в JS.
Комментарии:
1. Спасибо за ответы. Я добавил краткий обзор файла .js. Я все еще получаю ту же ошибку. Я удалил ‘onload’ в теге ‘body’ … имеет ли значение, где я вызываю скрипт ‘.js’ … должен ли он быть в теге ‘head’ вместо этого?
2. Поскольку вы сказали EJS; вы загружаете это с веб-сервера, а не из локального файла, верно?
3. Да, это правильно. Я переместил свой вызов скрипта ‘.js’ в тег head файла .ejs. Это, казалось, решило проблему … однако была выявлена другая проблема, похоже, что мои переданные переменные с сервера не могут быть прочитаны внешним файлом .js. Например, когда я отображаю страницу с сервера, я передаю массив, как такой «res.render(‘pages/_gallery’, {pix_list: _gallery});». Однако моя переменная (например, «<%= pix_list.length %>») не читается в прикрепленном файле .js… Вероятно, мне нужно опубликовать это как отдельный вопрос…
4. Храните подобные данные в
data-*
атрибуте, а затем считывайте их из JS.5. Спасибо за ответ. Извините, я не понимаю, в каком контексте это должно быть сформировано. Я смотрю на » ejs.co » веб-страница и не вижу тега, который использует «*» подобным образом. Кажется, я мог прочитать переменные ejs, переданные с сервера, перед использованием встроенного скрипта на странице .ejs … однако, похоже, он не передается во внешний файл .js …?