#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:
- Посмотрите на созданный вами 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) .';';
'img-src' => [ "data:", ],
означает, что вы не загружаете изображения с собственного сайта. это крайне редкий случай, поэтому'img-src' => [ "'self'", "data:", ],
намного лучше.- Использование
default-src
как souce для неявного инициализации других директив является плохой практикой. Это можно использовать в простых случаях, но не в вашем — позже вы захотите избавиться от директивы'unsafe-inline'
inscript-src
, поскольку ее использование не защищает от XSS.
Так что вам придется использовать'unsafe-inline'
forstyle-src
и использовать'nonce-value'
forscript-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
тем, что у меня есть сейчас, может быть устранена, чтобы не было проблем?