我实际上正在尝试在我的 Laravel/Inertia 项目中添加 CSP。
我安装了 spatie/laravel-csp 包并使用
Vite::useCspNonce()
; 生成随机数
我还在我的主刀片应用程序中设置了 csp_nonce 元属性,但在构建资产后我总是在控制台中遇到相同的错误:
EvalError:拒绝将字符串评估为 JavaScript,因为“unsafe-eval”不是以下内容安全策略指令中允许的脚本源:“script-src 'self' 'nonce-nonceGenerate'”
这是我的 csp 配置文件:
<?php
return [
/*
* A policy will determine which CSP headers will be set. A valid CSP policy is
* any class that extends `Spatie\Csp\Policies\Policy`
*/
'policy' => \App\Support\CustomPolicy::class,
/*
* This policy which will be put in report only mode. This is great for testing out
* a new policy or changes to existing csp policy without breaking anything.
*/
'report_only_policy' => '',
/*
* All violations against the policy will be reported to this url.
* A great service you could use for this is https://report-uri.com/
*
* You can override this setting by calling `reportTo` on your policy.
*/
'report_uri' => env('CSP_REPORT_URI', ''),
/*
* Headers will only be added if this setting is set to true.
*/
'enabled' => env('CSP_ENABLED', true),
/*
* The class responsible for generating the nonces used in inline tags and headers.
*/
'nonce_generator' => \App\Support\ViteNonceGenerator::class
];
在我的自定义策略中,我仅使用基本策略并添加 shouldNotApplied 来处理糟糕的错误,如文档中所示。
这是我的 app.blade.php :
<!doctype html>
<html lang="{{ str_replace("_", "-", app()->getLocale()) }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta property="csp-nonce" content="{{ csp_nonce() }}">
@vite('resources/js/app.js')
@vite('resources/css/app.scss')
@inertiaHead
</head>
<body>
@inertia
</body>
</html>
我尝试使用 Laravel 文档中所示的中间件和 spatie 包,但没有成功。
错误消息与随机数无关,而是与您正在评估脚本中的字符串这一事实有关。设置 script-src/default-src 时,默认情况下禁止对 eval、new Function、setInterval 或 setTimeout 中的字符串进行求值。您要么必须重写这些,要么通过添加“unsafe-eval”来允许它们(这当然是不安全的)。