我运行一个用 Laravel 开发的应用程序。 我需要在 page.blade.php 页面上添加一个脚本。 我在此页面中插入的每个脚本都被开发人员控制台错误阻止:“将资源加载到内联的脚本被页面设置(“script-src”)阻止”
我发现在 main-install-folder/config/app 中的其他 app.php 文件中有以下行:
/*
|--------------------------------------------------------------------------
| By default X-Frame-Options header is enabled and set to SAMEORIGIN.
| Via this option you can disable it (APP_X_FRAME_OPTIONS=false) or set custom value:
| - DENY
| - ALLOW-FROM example.org
|-------------------------------------------------------------------------
*/
'x_frame_options' => env('APP_X_FRAME_OPTIONS', true),
/*
|--------------------------------------------------------------------------
| Enable Content-Security-Policy meta tag to prevent possible XSS attacks.
|-------------------------------------------------------------------------
*/
'csp_enabled' => env('APP_CSP_ENABLED', true),
'csp_script_src' => env('APP_CSP_SCRIPT_SRC', ''),
现在,如果我将 csp_enabled 从 true 更改为 false 并清理应用程序缓存,我放入 page.blade.php 中的脚本可以工作,但我想我会创建一个 XSS 弱点。
如何允许我的单个脚本将 csp_enabled 设置为 true?
我尝试过的:
我尝试将以下元标记添加到blade.php页面:
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline'">
但这没有任何帮助,而且我也不知道使用是否安全。 使用页面中的此元标记并将 csp_enabled 在另一个 app.php 文件中设置为 true 时,错误仍然是相同的:脚本不起作用,并且开发人员控制台显示我之前告诉过的相同错误。
我读到了有关运行脚本 Nonce 的信息,我尝试将 Nonce 添加到脚本中,但我不知道该怎么做。我尝试过的方法没有用。
我阅读了本指南
https://laravel-news.com/laravel-content-security-policies
我尝试更改我的脚本:
<script>
//* script code
</script>
至
<script nonce="{{ csp_nonce() }}">
//* script code
</script>
但是这段代码会产生 500 错误。另外,如果我尝试输入随机字符串。
下面的文章似乎讨论了我在 Laravel 应用程序上找到的设置,但我没有找到并理解如何解决
https://hummingbirduk.com/managing-a-content-security-policy-with-laravel
我也尝试插入这样的脚本:
<script nonce="1234"></script>
但还是不行。
我能够让脚本工作的唯一方法是将 csp_enabled 设置为 false
我还尝试将脚本代码移动到文件中,然后在 balde 页面中调用,但如果 csp_enabled 设置为 true,错误和结果是相同的
我的期望:
首先保持安全性,因此将 csp_enabled 保持为 true 并允许我添加单个脚本。 我该怎么办?
显示错误消息可能有助于了解问题的根本原因。根据您提供的信息,我认为这是一般情况:
启用CSP后,根据第一个代码部分的注释将其添加为元标记。最后一行似乎表明 script-src 为空,这将不允许所有类型的脚本。
然后您尝试在元标记中添加另一个 CSP 策略。现在您有两个策略,并且您的内容需要通过这两个策略。没有任何变化,因为它在启用时仍然需要通过初始策略。
您的下一步应该是删除您添加的元标记并使用其内容来修改 script-src 配置,如下所示:
'csp_script_src' => env('APP_CSP_SCRIPT_SRC', "'self' 'unsafe-inline'"),
如果这有效,您现在可以控制您的策略并可以不断调整它。