Каких функций, связанных с eval (), следует избегать при включенном CSP? - PullRequest
0 голосов
/ 30 сентября 2018

Я связываю свое приложение React с Webpack и добавляю Content Security Policy (CSP) заголовки (в частности, не разрешая unsafe-eval в script-src).Конечно, я проверяю, что мой последний пакет и чанки не содержат eval().Тем не менее, последняя версия Firefox-dev 63.0b10 по-прежнему отказывается загружать основной блок со следующей ошибкой:

Политика безопасности содержимого: настройки страницы заблокировали загрузку ресурса в self («script-src»)).Источник: вызов eval () или связанной функции, заблокированной CSP.

Хорошо, но у меня нет eval() в моем комплекте.Какими могут быть эти «связанные функции»?

PS Это вопрос с автоответчиком , но не стесняйтесь расширять

1 Ответ

0 голосов
/ 30 сентября 2018

Документы Mozilla для CSP , перечисляет "eval() и аналогичные методы" в качестве возможных нарушителей:

[...] 'unsafe-eval' Позволяет использоватьeval () и аналогичные методы для создания кода из строк.[...]

Спецификация CSP3 § 1.2.1 , упоминает "eval() и подобные конструкции":

Снижение рискаатаки с внедрением контента, предоставляя разработчикам достаточно детальный контроль над [...] динамическим выполнением кода (посредством eval () и аналогичных конструкций) [...]

Но окончательный ответ - в CSP3spec, в § 6.1.10.4 :

Следующие приемники выполнения JavaScript стробируются в исходном выражении unsafe-eval: eval () Function () setTimeout () withначальный аргумент, который нельзя вызвать.setInterval () с начальным аргументом, который нельзя вызвать.Примечание. Если пользовательский агент реализует нестандартные приемники, такие как setImmediate () или execScript (), они ДОЛЖНЫ также быть определены как «unsafe-eval».

Итак, для целей CSP полный списокиз «конструкций выполнения динамического кода», eval() «аналогичные методы», «связанные функции», «аналогичные конструкции»:

eval()
Function()     // typically new Function()
setTimeout()   // with non-callable argument
setInterval()  // with non-callable argument
setImmediate()
execScript()

В моем случае я нашел несколько new Function(...) фрагментовв связке и теперь выясняем, как предотвратить их появление.

Бонус

Если вы берете grepl или подобный grep -подобный инструмент, который находитСтрока соответствует и печатает окружающий контекст на основе char-by-char (а не построчно, как обычно grep). Вы можете использовать следующую команду, чтобы найти «конструкции динамического выполнения кода» во всех файлах вашего комплекта(минимизированное и разделенное по кодам) приложение:

find "<build_dir>"" -type f -iname "*.js" -exec grepl -k 512 -H "(eval|Function)(\s|\t)*\(" '{}' \;

В качестве альтернативы, вы можете отключить JS Minifier (например, UglifyJS) и проверить вашу сборку с обычным grep.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...