【问题标题】:Impossible to run external javascript from HTML/EJS file无法从 HTML/EJS 文件运行外部 javascript
【发布时间】:2023-04-06 11:27:01
【问题描述】:

我正在尝试在 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  

}

【问题讨论】:

  • 那个脚本标签坏了。开始标签缺少结束标签 >

标签: javascript html ejs content-security-policy


【解决方案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 文件......?
猜你喜欢
  • 2021-11-23
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 2019-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
相关资源
最近更新 更多