CSP: как разрешить небезопасный-eval для данного префикса URI (Firefox)
Я пытаюсь использовать MathJax как часть нашего веб-приложения, которое использует довольно строгий политика безопасности контента (CSP). Проблема в том, что MathJax закодирован для использования eval() [если быть точным, в виде Function()] который не считается безопасным по умолчанию CSP.
в настоящее время я использую следующий заголовок CSP:
X-security-policy/" class="blnk">Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation';
что приводит к сбою кода MathJax 2.0, потому что он использует Function(). Я попытался разрешить unsafe-eval (т. е. Function()) только для MathJax, расположенного в том же происхождении ниже пути /:static/math/. Для этого я попытался добавить
unsafe-eval '/:static/math/*'
чтобы сделать полный заголовок похожим на
X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; unsafe-eval '/:static/math/*'
но я все еще не могу Firefox 13.0 запустить код. Я получаю сообщение об ошибке в веб-консоль Firefox (находится в Tools-Web Developer):
[10:09:59.072] call to Function() blocked by CSP @ http://localhost:8080/:static/math/2.0/MathJax.js?config=TeX-AMS-MML_HTMLorMML:29
тем не менее, я не получаю отчет CSP в "report-uri". (Как вы видите, в настоящее время я запускаю тест через пользовательский порт localhost без SSL, если это имеет значение. Двоеточие перед static не опечатка, я резервирую все части пути, начиная с двоеточия для внутреннего использования приложения, весь пользовательский контент может свободно определять другие URL-адреса.)
мне unsafe-eval атрибут неверен или невозможно разрешить небезопасную оценку только для подмножества "я"? цель состоит в том, чтобы разрешить unsafe-eval только для того же префикса исходного пути /:static/math, строгое выполнение кода CSP JS для'self ' и нет JS код для любого другого метода.
1 ответов
есть несколько вопросов:
на
Content-Security-Policy(CSP) заголовок не работает таким образом. CSP имеет только степень детализации одной комбинации хост+порт (origin). Если вы не можете разрешить всем скриптам иметьunsafe-eval, ни один сценарий не может иметь его. Единственным возможным обходным путем является не использовать сценарий, который требуетunsafe-eval(к счастью, MathJax больше не требуетunsafe-evalС ошибка MathJax 256 была исправлена).на
allowсинтаксис является старым вариантом Mozilla и не должен использоваться. Текущий синтаксис сказатьdefault-srcследуют схемы или имена хостов или происхождения, которые разрешены в качестве источника всего, а затем переопределяют значение по умолчанию для каждого подтипа (например,script-src) по мере необходимости. Некоторые источники могут поддерживать дополнительные ключевые слова источника в дополнение кself. Например,script-srcподдерживаетunsafe-evalчто означает, что любой скрипт, которому в противном случае разрешено выполнять, может запускать eval() или Function (), иunsafe-inlineозначает, что любой фрагмент разметки, который может поддерживать какой-либо встроенный скрипт, может выполняться. Позволяяunsafe-evalможет быть приемлемым, ноunsafe-inlineв значительной степени не идет со скриптом-src (в противном случае вы не должны беспокоиться о CSP вообще).-
синтаксис
script-srcследующим образом:script-src 'self' cdnjs.cloudflare.comв сочетании с загрузкой MathJax из https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js
-
MathJax также использует встроенные атрибуты стиля, поэтому необходимо (если уже не разрешено), или MathJax поднимет
Exceptionпри попытке отобразить математику:style-src 'self' 'unsafe-inline'невозможно использовать CSP, чтобы позволить JS вставлять атрибуты стиля и не иметь атрибутов стиля, уже вставленных в источник HTML, чтобы иметь эффект.
это кажется, что Firefox 13.0 (по крайней мере) не сразу "звонит домой" в случае нарушения CSP. Большинство сообщений о нарушениях отправляются через некоторое время после события. Chrome кажется гораздо более агрессивным с представлением отчета, что сделает его немного легче протестировать. По моему опыту, Firefox не всегда отправляет отчет CSP вообще - он может использовать какую-то эвристику, чтобы не отправлять повторяющиеся сообщения.
в конце концов, чтобы MathJax работал с Content-Security-Protection, вам нужны следующие заголовки (если вы используете MathJax через CDNJS):
Content-Security-Policy: default-src 'self'; script-src 'self' cdnjs.cloudflare.com; style-src 'self' 'unsafe-inline';
старые браузеры (например, Firefox 13), используемые для дополнительных параметров, таких как options или требуется использовать нестандартное имя headere, такое как X-Content-Security-Policy или X-WebKit-CSP. Эти хаки больше не требуются, потому что пользовательские агенты поддерживают стандартный заголовок в настоящее время. (за исключением MSIE в противоположность MS Edge.)