Невозможно запустить внешний javascript из файла HTML / EJS

#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 …?