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.)