You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel启用CSP后如何在Blade页面允许单个脚本?

解决Laravel开启CSP时允许单个内联脚本的方法

针对你遇到的CSP拦截内联脚本问题,以下几种方法可以在保持csp_enabled=true的前提下解决:

方法一:添加脚本哈希到CSP配置

CSP允许通过脚本内容的哈希值授权特定内联脚本,步骤如下:

  1. 提取你要添加的内联脚本的纯内容(不要包含<script>标签),用终端生成SHA-256哈希:
    echo -n "你的内联脚本代码" | openssl dgst -sha256 -binary | base64
    
  2. 把生成的哈希值添加到CSP的script-src规则中:
    • 方式1:修改.env文件:
      APP_CSP_SCRIPT_SRC='self' 'sha256-生成的哈希字符串'
      
    • 方式2:直接编辑config/app.php:
      'csp_script_src' => "'self' 'sha256-生成的哈希字符串'",
      
  3. 清理配置缓存:
    php artisan config:clear
    

刷新页面后,该内联脚本会被CSP允许执行。

方法二:正确使用Nonce授权

你之前用csp_nonce()报错,大概率是项目未正确生成和绑定nonce,正确步骤:

  1. 在App\Providers\AppServiceProvider的boot方法中生成nonce并共享给视图,同时更新CSP配置:
    use Illuminate\Support\Facades\View;
    use Illuminate\Support\Str;
    
    public function boot()
    {
        $nonce = Str::random(32);
        // 把nonce共享给所有视图
        View::share('csp_nonce', $nonce);
        // 将nonce加入CSP的script-src规则
        config(['app.csp_script_src' => "'self' 'nonce-$nonce'"]);
    }
    
  2. 在page.blade.php中使用这个nonce:
    <script nonce="{{ $csp_nonce }}">
        // 你的内联脚本代码
    </script>
    
  3. 清理缓存并重启服务:
    php artisan config:clear
    php artisan serve --restart
    

方法三:检查外部脚本路径(若使用外部文件)

如果你把脚本移到外部文件仍被拦截,需确认:

  • 脚本文件在项目本地的话,确保'self'已包含在csp_script_src中;
  • 脚本在外部CDN的话,把CDN域名添加到csp_script_src,比如:
    APP_CSP_SCRIPT_SRC='self' https://cdn.yourdomain.com
    

注意事项

不要尝试用meta标签添加CSP规则——如果服务器已经通过响应头发送了CSP配置,meta标签的规则会被忽略或被更严格的响应头规则覆盖,直接修改config/app.php或.env中的CSP配置才是有效的方式。

内容的提问来源于stack exchange,提问作者Marco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:22:21