内容安全策略包含无效来源

Content Security Policy contains an invalid source

我正在尝试在我的网站上使用内容安全策略,我已经做对了一切,一切正常,但这个错误仍然出现在控制台中

The source list for the Content Security Policy directive 'default-src' contains an invalid source: 'data:frame-src'. It will be ignored.

我哪里做错了?这里有什么问题?

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class ContentSecurityPolicy
{
    public $resources = [
        'default-src' => [
            "'self'",
            "'unsafe-inline'",
            'cdn.jsdelivr.net',
            '*.googletagmanager.com',
            'fonts.googleapis.com',
            'cdnjs.cloudflare.com',
            'fonts.gstatic.com',
            'code.jquery.com',
        ],
        'img-src' => [
            "data:",
        ],
        'frame-src' => [
            'youtube.com www.youtube.com',
        ],
    ];

    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);

        $contentSecurityPolicy = '';
        foreach ($this->resources as $key => $values) {
            $contentSecurityPolicy .= $key . ' ' . implode(' ', $values);
        }

        $response->header("Content-Security-Policy", $contentSecurityPolicy);

        return $response;
    }
}

还有一个错误

Refused to load the image 'https://ssl.gstatic.com/ui/v1/icons/mail/images/2/openhand.cur' because it violates the following Content Security Policy directive: "default-src 'self' 'unsafe-inline' cdn.jsdelivr.net *.googletagmanager.com fonts.googleapis.com cdnjs.cloudflare.com fonts.gstatic.com code.jquery.comimg-src data:frame-src youtube.com www.youtube.com". Note that 'img-src' was not explicitly set, so 'default-src' is used as a fallback.

  1. 查看您生成的 CSP:

default-src 'self' 'unsafe-inline' cdn.jsdelivr.net *.googletagmanager.com fonts.googleapis.com cdnjs.cloudflare.com fonts.gstatic.com code.jquery.comimg-src data:frame-src youtube.com www.youtube.com

但通常应该是:

default-src 'self' 'unsafe-inline' cdn.jsdelivr.net *.googletagmanager.com fonts.googleapis.com cdnjs.cloudflare.com fonts.gstatic.com code.jquery.com; img-src data:; frame-src youtube.com www.youtube.com

指令之间缺少一个分号 ;。更改行:

$contentSecurityPolicy .= $key . ' ' . implode(' ', $values);

到:

$contentSecurityPolicy .= $key . ' ' . implode(' ', $values) .';';
  1. 'img-src' => [ "data:", ], 表示您不从自己的站点加载图像。这种情况极为罕见,因此 'img-src' => [ "'self'", "data:", ], 更好。

  2. 使用 default-src 作为隐式初始化其他指令的来源是一种不好的做法。这可以用在简单的情况下,但不能用在你的情况下——稍后你会想去掉 script-src 指令中的 'unsafe-inline',因为它的使用不能防止 XSS。
    因此,您必须对 style-src 使用 'unsafe-inline',对 script-src 使用 'nonce-value',但您未能在 default-src.[=45= 中混合这些标记] 在 default-src 中使用 'nonce-value' 也会在 Firefox 中使用 vulnerability

按照指令分发资源,这样你以后就不会头疼了。