Как предотвратить нарушение jQuery (в локальном файле) моей директивы CSP script-src?
Клиент хочет, чтобы мы добавили политику безопасности script-src в наше программное обеспечение, чтобы оно удовлетворяло его стандартам безопасности. Мне удалось создать относительно безопасную политику, которая по-прежнему позволяет запускать наш код... ЗА ИСКЛЮЧЕНИЕМ того, что я получаю консольную ошибку в своем браузере, в которой говорится: «Отказ от выполнения встроенного сценария, поскольку он нарушает следующую директиву политики безопасности содержимого», и это указывает в файл jquery-3.5.1.min.js. Ошибка не дает мне больше полезных деталей. (Это не указывает на конкретную строку в нашем коде как на проблему.)
Судя по форумам jQuery, такая проблема была исправлена в jQuery несколько версий назад, поэтому я понятия не имею, почему это происходит в данном случае.
Я также видел, что некоторые люди получают доступ к jQuery с удаленного URL-адреса, поэтому исправление состоит в том, чтобы просто добавить этот URL-адрес в script-src, но текущий план состоит в том, чтобы продолжать получать доступ к jQuery из локального файла.
Мне нужно выяснить, как перестать получать эту ошибку, не делая код настолько небезопасным, что он в первую очередь лишает цели использования script-src (в этот момент код, вероятно, просто снова не пройдет проверку безопасности клиента).
Мой текущий подход к политике script-src заключается в использовании одноразового номера. Насколько мне известно, одноразовый номер не может быть сгенерирован или перенесен в Web.config, поэтому единственный CSP в Web.config таков:
<add name="Content-Security-Policy" value="object-src 'none';" />
Метод Configuration() внутри Startup.cs вызывает другой метод ConfigureNonce(), который создает одноразовый номер и устанавливает политику script-src:
private void ConfigureNonce(IAppBuilder app)
{
app.Use((context, next) =>
{
var rng = new RNGCryptoServiceProvider();
var nonceBytes = new byte[32];
rng.GetBytes(nonceBytes);
var nonce = Convert.ToBase64String(nonceBytes);
context.Set("ScriptNonce", nonce);
context.Response.Headers.Add("Content-Security-Policy",
new[] { string.Format("script-src 'self' 'unsafe-eval' xxxxxx yyyyyy http://localhost:* 'nonce-{0}'", nonce) });
return next();
});
}
- «xxxxxx» — это URL-адрес внешнего поставщика, который мы используем для определенного виджета.
- 'yyyyyy' - это URL-адрес нашей справочной документации.
- «unsafe-eval», по-видимому, необходим, потому что мы используем кендо. [Спасибо, Кендо...]
- 'localhost', по-видимому, необходим в разработке, чтобы предотвратить нарушение script-src из-за ссылки на браузер, но его нужно будет удалить, когда мы перейдем к производству. [Спасибо, Visual Studio...]
Наконец, я создал новый вспомогательный файл с именем NonceHelper.cs, который просто содержит это:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace dTIMSi.Helpers
{
public static class NonceHelper
{
public static IHtmlString ScriptNonce(this HtmlHelper helper)
{
var owinContext = helper.ViewContext.HttpContext.GetOwinContext();
return new HtmlString(owinContext.Get<string>("ScriptNonce"));
}
}
}
Все это позволяет мне видеть, какие ошибки консоли веб-браузера я получаю для встроенных скриптов (их много), переходить к любой строке кода, на которую указывает каждая ошибка, и просто добавлять одноразовый номер, например:
<script type="text/javascript" nonce="@Html.ScriptNonce()">
//bla bla bla, doin' some inline script stuff
</script>
Надеюсь, все понятно и все в порядке. Но почему я получаю ошибку в файле jQuery и как ее исправить?