Я добавил следующее в свое приложение 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 и что на каждом этапе тестируете изменения, чтобы локализовать и отслеживать новые ошибки.