在脚本标签中添加CSP随机数

问题描述 投票:0回答:1

我实际上正在尝试在我的 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 包,但没有成功。

laravel vue.js vite content-security-policy inertiajs
1个回答
0
投票

错误消息与随机数无关,而是与您正在评估脚本中的字符串这一事实有关。设置 script-src/default-src 时,默认情况下禁止对 eval、new Function、setInterval 或 setTimeout 中的字符串进行求值。您要么必须重写这些,要么通过添加“unsafe-eval”来允许它们(这当然是不安全的)。

© www.soinside.com 2019 - 2024. All rights reserved.