Опция 1
Если вы можете заранее вычислить га sh скрипта, который вы загружаете (если это не что-то, генерируемое динамически), тогда простой способ избежать
включение script-sr c unsafe-eval в Content-Security-Policy
означает добавление в CSP только ха sh этого указанного c сценария заголовок - это по-прежнему гарантирует, что вы не выполняете никакого ненадежного кода, и в то же время позволяет загружать и выполнять сценарий вручную.
В MDN есть еще несколько примеров реализации таких политик CSP здесь .
Что касается самой загрузки, у вас есть два разных пути отсюда:
Опция 1.1
Объедините ha sh с политикой CSP3 unsafe-hashes
, которая позволит вам продолжать использовать Function
или eval
, как вы в настоящее время, но при этом ограничивать код только доверенным.
Например, если у вас есть скрипт типа
alert('Hello, world.');
, тогда ваш заголовок CSP должен содержать
Content-Security-Policy: script-src 'unsafe-hashes' 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='
К сожалению, CSP lev el 3, или, по крайней мере, эта опция поддерживается только в Chromium на момент написания.
Option 1.2
Вместо использования Function
или eval
, вы можете динамически создать тег сценария из JavaScript, заполнить его textContent
содержимым вашего ответа и вставить его в DOM:
let resource = await fetch('heavy_file.js')
resource.clone().body.pipeTo(new WritableStream({
write(t) { on_receive(t.length) }
}));
resource.text().then(res => {
let s = document.createElement('script');
s.textContent = res;
document.head.appendChild(s);
});
В этом случае вам нужно только добавить ха sh сценария для CSP, и он будет работать во всех браузерах:
Content-Security-Policy: script-src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='
Вариант 2
Если вы хотите поддерживать динамически генерируемые сценарии, тогда единственным вариантом может быть переместите свой код отслеживания прогресса в Service Worker, а затем используйте Client.postMessage
, чтобы сообщить о ходе выполнения сценарию на странице.
Это будет работать для любого контента, полученного из вашего источника, но только после установки Service Worker - обычно при последующей загрузке страницы, что может не помочь вам, если загружаемый вами большой скрипт является частью страницы, которую пользователь сначала посещает на вашем сайте.