Политика безопасности содержимого содержит недопустимый источник

#laravel #content-security-policy

#laravel #content-security-policy

Вопрос:

Я пытаюсь использовать политику безопасности содержимого на своем сайте, я уже все сделал правильно, и все работает, но эта ошибка по-прежнему отображается в консоли

Список источников для директивы политики безопасности содержимого ‘default-src’ содержит недопустимый источник: ‘data: frame-src’. Он будет проигнорирован.

Где я ошибся? Что здесь не так?

 <?php

namespace AppHttpMiddleware;

use Closure;
use IlluminateHttpRequest;

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;
    }
}
 

Существует также другая ошибка

Отказано в загрузке изображения ‘https://ssl.gstatic.com/ui/v1/icons/mail/images/2/openhand.cur ‘потому что это нарушает следующую директиву политики безопасности контента: «default-src ‘self’ ‘unsafe-inline’ cdn.jsdelivr.net *.googletagmanager.com fonts.googleapis.com cdnjs.cloudflare.com fonts.gstatic.com code.jquery.comimg-данные src:фрейм-src youtube.com www.youtube.com «. Обратите внимание, что ‘img-src’ явно не был установлен, поэтому ‘default-src’ используется в качестве запасного варианта.

Ответ №1:

  1. Посмотрите на созданный вами CSP:

по умолчанию -src ‘self’ ‘небезопасный-встроенный’ cdn.jsdelivr.net *.googletagmanager.com fonts.googleapis.com cdnjs.cloudflare.com fonts.gstatic.com code.jquery.comimg-данные src :фрейм-src youtube.com www.youtube.com

но обычно это должно быть:

по умолчанию -src ‘self’ ‘небезопасный-встроенный’ cdn.jsdelivr.net *.googletagmanager.com fonts.googleapis.com cdnjs.cloudflare.com fonts.gstatic.com code.jquery.com ; img-src данные:; 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 как souce для неявного инициализации других директив является плохой практикой. Это можно использовать в простых случаях, но не в вашем — позже вы захотите избавиться от директивы 'unsafe-inline' in script-src , поскольку ее использование не защищает от XSS.
    Так что вам придется использовать 'unsafe-inline' for style-src и использовать 'nonce-value' for script-src , но вы не смогли смешать эти токены в default-src .
    Также используя 'nonce-value' в default-src лидахк уязвимости в Firefox.

Распределяйте исходные тексты в соответствии с директивами, это избавит вас от головной боли в будущем.

Комментарии:

1. сделал так $contentSecurityPolicy .= $key . ' ' . implode(' ', $values) . ';' . ' '; , и теперь я все делаю правильно

2. 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;

3. Но я получаю ошибки Refused to load the image '<URL>' because it violates the following Content Security Policy directive: "img-src data:".

4. (1) Я обновил ответ и добавил 'self' к img-src . (2) Используйте Firefox, чтобы увидеть, какой реальный URL скрывается под Chrome <URL> . Вы должны добавить домен с этого URL-адреса в img-src . Я могу предположить, что вы используете GTM, поэтому вам нужны дополнительные источники в вашем CSP.

5. Мне удалось решить это с img-src помощью , но теперь, как вы уже сказали, проблема с default-src тем, что у меня есть сейчас, может быть устранена, чтобы не было проблем?