无法从 HTML/EJS 文件运行外部 javascript

Posted

技术标签:

【中文标题】无法从 HTML/EJS 文件运行外部 javascript【英文标题】:Impossible to run external javascript from HTML/EJS file 【发布时间】:2021-03-14 07:59:52 【问题描述】:

我正在尝试在 html/EJS 页面内的外部文件中运行 javascript。代码如下:

<body onload="initialize()">

//HTML content

  <script src="/public/js/gallery.js"</script>

</body>

“initialize()”函数位于“gallery.js”文件中。问题是我不断收到错误消息:

“拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”。'unsafe-inline' 关键字,哈希('sha256-tPMkUWbNPBXQQ3rlbFhILb35szR89eQb3Z41bzLr+wQ='),或者需要一个 nonce ('nonce-...') 来启用内联执行。"

我在页面上的“head”标签中尝试了许多尝试修复。其中包括“”、“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】:

通过禁用禁止内联脚本的 CSP 规则来解决这个问题并不是一个好主意。内联脚本是 XSS 攻击的主要载体。

相反,删除内联脚本并将等效功能放入 .js 文件本身。

从 HTML 中删除 onload="initialize()"

在 JS 中添加addEventListener("load", initialize)

【讨论】:

感谢您的回复。我添加了“.js”文件的概要。我仍然遇到同样的错误。我已经删除了“body”标签中的“onload”...我在哪里调用“.js”脚本是否重要...应该在“head”标签中代替吗? 既然你说的是EJS;您正在从网络服务器而不是本地文件加载它,对吧? 是的,这是正确的。我将我对“.js”脚本的调用移动到 .ejs 文件的头部标记。这似乎解决了错误......但是另一个问题已经被发现,似乎我从服务器传递的变量无法被外部“.js”文件读取。例如,当我从服务器渲染页面时,我传递一个数组,例如“res.render('pages/_gallery', pix_list: _gallery);”。但是我的变量(例如“”)未在附加的“.js”文件中读取...我可能需要将其作为单独的问题发布... 将这样的数据存储在data-*属性中,然后从JS中读取。 感谢您的回复。抱歉,我不明白应该形成什么上下文。我正在查看“ejs.co”网页,但没有看到像这样使用“*”的标签。在 .ejs 页面上使用内联脚本之前,我似乎可以读取从服务器传递的 ejs 变量......但是它似乎没有传递给外部 .js 文件......?

以上是关于无法从 HTML/EJS 文件运行外部 javascript的主要内容,如果未能解决你的问题,请参考以下文章

Node JS+Express:如何在 HTML(EJS) 中定义和使用 MySQL 数据?

Java 8 .jar 文件不会使用 Netbeans 8.0.2 从桌面运行以使用外部库进行编译;如果库包含在源代码中,则运行良好

如何从 mongodb 获取数据并使用节点 js 将其显示在表中?

如何从 Java EE 应用程序外部化 PDF?

lambda 中的 Java 8 lambda 无法从外部 lambda 修改变量

无法从外部网络访问 XAMPP Web 服务器