Почему я получаю эту ошибку политики контента?

Вопросы и ответы

Я добавил следующее в свое приложение Blazor Interactive Server с использованием NWebSec:

app.UseHsts(options => options.MaxAge(days: 30));
app.UseXContentTypeOptions();
app.UseXXssProtection(options => options.EnabledWithBlockMode());
app.UseXfo(options => options.SameOrigin());
app.UseReferrerPolicy(opts => opts.NoReferrerWhenDowngrade());

app.UseCsp(options => options
    .DefaultSources(s => s.Self()
        .CustomSources("data:", "https:"))
    .StyleSources(s => s.Self()
        .CustomSources("*.microsoft.com", "*.windows.net", "*.azurewebsites.net", "www.google.com",
            "fonts.googleapis.com")
        .UnsafeInline()
    )
    .ImageSources(s => s.Self()
        .CustomSources("data:", "https:"))
    .FontSources(s => s.Self()
        .CustomSources("fonts.googleapis.com"))
    .ScriptSources(s => s.Self()
        .CustomSources("*.microsoft.com", "*.windows.net", "*.azurewebsites.net", "www.google.com",
            "cse.google.com")
        .UnsafeInline()
        .UnsafeEval()
    )
    .WorkerSources(s => s.Self()
        .CustomSources("louishowe-dev.azurewebsites.net", "*.microsoft.com", "*.windows.net", "*.azurewebsites.net"))
);

// NWebSec не обрабатывает это (нет обновлений для этой библиотеки на протяжении 4 лет)
app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Permissions-Policy", "geolocation=*, camera=(), microphone=()");
    await next.Invoke();
});

И я получаю следующие ошибки:

Отказано в загрузке шрифта '<URL>', потому что он нарушает следующую директиву политики безопасности контента: "font-src 'self' fonts.googleapis.com".
Понять эту ошибку

Отказано в создании worker с 'blob:https://louishowe-dev.azurewebsites.net/02bff816-5188-44d1-9395-484a2964920e', потому что он нарушает следующую директиву политики безопасности контента: "worker-src 'self' louishowe-dev.azurewebsites.net *.microsoft.com *.windows.net *.azurewebsites.net".

Необработанная ошибка безопасности: Не удалось создать 'Worker': Доступ к скрипту по адресу 'blob:https://louishowe-dev.azurewebsites.net/02bff816-5188-44d1-9395-484a2964920e' запрещен политикой безопасности контента документа.

Я считаю, что оба этих URL явно указаны как разрешенные. Я даже добавил louishowe-dev.azurewebsites.net вместе с *.azurewebsites.net. И все равно не удается создать worker. Что я делаю не так?

Что касается шрифта, не уверен, что мне нужно включить, чтобы разрешить <URL>.

Ответ

Ошибка содержания политики, с которой вы столкнулись, связана с настройками вашей Content Security Policy (CSP), которые могут не включать необходимые разрешения для динамически загружаемых ресурсов, таких как шрифты и веб-воркеры.

Ошибка с шрифтами

Ваше сообщение об ошибке говорит:

Refused to load the font '<URL>' because it violates the following Content Security Policy directive: "font-src 'self' fonts.googleapis.com".

Это указывает на то, что загруженный шрифт не соответствует директиве font-src вашей CSP. На данный момент ваша политика разрешает загрузку шрифтов только из self и fonts.googleapis.com.

Если <URL> указывает на адрес, который отличается от fonts.googleapis.com и self, вам необходимо добавить его в директиву font-src. Вот пример того, как вы можете изменить вашу настройку CSP:

.FontSources(s => s.Self()
    .CustomSources("fonts.googleapis.com", "<URL>")
)

Замените <URL> на фактический адрес, который вы хотите разрешить для загрузки шрифтов.

Ошибка с веб-воркерами

Ошибка:

Refused to create a worker from 'blob:https://louishowe-dev.azurewebsites.net/02bff816-5188-44d1-9395-484a2964920e' because it violates the following Content Security Policy directive: "worker-src 'self' louishowe-dev.azurewebsites.net *.microsoft.com *.windows.net *.azurewebsites.net".

указывает на то, что создание воркера из blob: URL запрещено вашей CSP. По умолчанию браузеры не добавляют blob: в источники. Для разрешения работы с blob: вы должны обновить вашу директиву worker-src, добавив blob: в список разрешенных источников. Вот как это может выглядеть:

.WorkerSources(s => s.Self()
    .CustomSources("louishowe-dev.azurewebsites.net", "*.microsoft.com", "*.windows.net", "*.azurewebsites.net", "blob:")
)

Итоговые изменения

С учетом вышеизложенного, ваша обновленная CSP может выглядеть следующим образом:

app.UseCsp(options => options
    .DefaultSources(s => s.Self()
        .CustomSources("data:", "https:"))
    .StyleSources(s => s.Self()
        .CustomSources("*.microsoft.com", "*.windows.net", "*.azurewebsites.net", "www.google.com", "fonts.googleapis.com")
        .UnsafeInline())
    .ImageSources(s => s.Self()
        .CustomSources("data:", "https:"))
    .FontSources(s => s.Self()
        .CustomSources("fonts.googleapis.com", "<URL>")) // добавьте здесь фактический URL
    .ScriptSources(s => s.Self()
        .CustomSources("*.microsoft.com", "*.windows.net", "*.azurewebsites.net", "www.google.com", "cse.google.com")
        .UnsafeInline()
        .UnsafeEval())
    .WorkerSources(s => s.Self()
        .CustomSources("louishowe-dev.azurewebsites.net", "*.microsoft.com", "*.windows.net", "*.azurewebsites.net", "blob:")) // добавление blob:
);

После внесения этих изменений, перезапустите ваше приложение и проверьте, исчезли ли ошибки. Если вы по-прежнему сталкиваетесь с проблемами, убедитесь, что вы проверяете правильные URL и что на каждом этапе тестируете изменения, чтобы локализовать и отслеживать новые ошибки.

Оцените материал
Добавить комментарий

Капча загружается...