无法从 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 将其显示在表中?