Как предотвратить нарушение 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();
            });
        }
  1. «xxxxxx» — это URL-адрес внешнего поставщика, который мы используем для определенного виджета.
  2. 'yyyyyy' - это URL-адрес нашей справочной документации.
  3. «unsafe-eval», по-видимому, необходим, потому что мы используем кендо. [Спасибо, Кендо...]
  4. '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 и как ее исправить?

0 ответов

Другие вопросы по тегам