我已经读了几篇关于为网站实现内容安全策略的文章,但是我仍然不知道如何正确地为我的网站将其组合在一起。 抱歉,如果有另一个线程关于这个,但到目前为止,我还没有找到一个将帮助我解决我的情况。
我有普通HTML文件,我使用自己的JavaScript根据用户输入在HTML画布上进行一些渲染。
我在“js”目录中有。js文件。 目前我在子目录运行我的网站,所以我使用相对而不是绝对路径包括他们:
<script type="text/javascript" src="js/wbsc-eval.js"></script>
<script type="text/javascript" src="js/wbsc-global.js"></script>
<script type="text/javascript" src="js/wbsc-input.js"></script>
<script type="text/javascript" src="js/wbsc-output.js"></script>
这是我的CSP报头:
<meta http-equiv="Content-Security-Policy" content="default-src 'none'; child-src 'none'; object-src 'none'; style-src 'self' https://stackpath.bootstrapcdn.com; script-src 'self';">
它允许我自己的CSS+Bootstrap的CSS,但是我的JS被阻止了:
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self'". Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.
根据我所读到的内容,我认为script-src'self'
应该允许来自同一站点的脚本,但显然不是这样。
我也试图设置一个显式的URL,我的站点目前托管在那里,但我不认为这是正确的方式,因为它应该是可移植的+它似乎不管怎么说都不工作。
有没有一些简单直截了当的方法来做到这一点? 允许一个我自己的脚本的显式集合而禁止其他所有东西?
添加“unsafe-inline”
起到了作用,但我听说这就像根本没有CSP一样,而且我还遇到了一些JS操作,我仍然不允许在我的脚本中执行这些操作。 我想我可以每次计算JS的SHA散列并将其传递给HTML头。 但是我在开发过程中不断地改变脚本,所以看起来不是很方便。 最后,如果有一些简单的机制来动态创建nonces,我可能会考虑使用它。 但就我的目的而言,我认为我不需要一些健壮的框架,我用一个HTML+几个JS文件就可以了。。。
错误消息显示:
拒绝执行内联事件处理程序
因此,该问题与您正在加载的元素没有任何关系(至少没有直接关系)。
在某个地方,你有类似的东西:
<button onclick="call_a_function()">
这是一个内联事件处理程序。
将其替换为AddEventListener
您的脚本工作正常问题是script-src:'self'
阻止了内联脚本的执行,即内联脚本和内联事件处理程序
。
您可以在受支持的浏览器中使用CSP 3 script-src-attr指令,但是使用el.AddEventListener
或el.onEvent
附加事件侦听器会更容易,正如Quentin在另一个答案中所说的那样。 如果您不能,因为它是某些第三方代码,即使用内联事件处理程序设置属性的代码,那么如果您不介意在较新版本上手动更新,那么使用hash
可能比nonce
更容易。
还要查看内容安全策略备忘单以了解更多详细信息。