提问者:小点点

CSP-允许我自己的脚本从给定的目录


我已经读了几篇关于为网站实现内容安全策略的文章,但是我仍然不知道如何正确地为我的网站将其组合在一起。 抱歉,如果有另一个线程关于这个,但到目前为止,我还没有找到一个将帮助我解决我的情况。

我有普通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文件就可以了。。。


共2个答案

匿名用户

错误消息显示:

拒绝执行内联事件处理程序

因此,该问题与您正在加载的和内联事件处理程序

您可以在受支持的浏览器中使用CSP 3 script-src-attr指令,但是使用el.AddEventListenerel.onEvent附加事件侦听器会更容易,正如Quentin在另一个答案中所说的那样。 如果您不能,因为它是某些第三方代码,即使用内联事件处理程序设置属性的代码,那么如果您不介意在较新版本上手动更新,那么使用hash可能比nonce更容易。

还要查看内容安全策略备忘单以了解更多详细信息。