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 ответов


есть несколько вопросов:

  1. на Content-Security-Policy (CSP) заголовок не работает таким образом. CSP имеет только степень детализации одной комбинации хост+порт (origin). Если вы не можете разрешить всем скриптам иметь unsafe-eval, ни один сценарий не может иметь его. Единственным возможным обходным путем является не использовать сценарий, который требует unsafe-eval (к счастью, MathJax больше не требует unsafe-eval С ошибка MathJax 256 была исправлена).

  2. на allow синтаксис является старым вариантом Mozilla и не должен использоваться. Текущий синтаксис сказать default-src следуют схемы или имена хостов или происхождения, которые разрешены в качестве источника всего, а затем переопределяют значение по умолчанию для каждого подтипа (например,script-src) по мере необходимости. Некоторые источники могут поддерживать дополнительные ключевые слова источника в дополнение к self. Например,script-src поддерживает unsafe-eval что означает, что любой скрипт, которому в противном случае разрешено выполнять, может запускать eval() или Function (), и unsafe-inline означает, что любой фрагмент разметки, который может поддерживать какой-либо встроенный скрипт, может выполняться. Позволяя unsafe-eval может быть приемлемым, но unsafe-inline в значительной степени не идет со скриптом-src (в противном случае вы не должны беспокоиться о CSP вообще).

  3. синтаксис script-src следующим образом:

    script-src 'self' cdnjs.cloudflare.com
    

    в сочетании с загрузкой MathJax из https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js

  4. MathJax также использует встроенные атрибуты стиля, поэтому необходимо (если уже не разрешено), или MathJax поднимет Exception при попытке отобразить математику:

    style-src 'self' 'unsafe-inline'
    

    невозможно использовать CSP, чтобы позволить JS вставлять атрибуты стиля и не иметь атрибутов стиля, уже вставленных в источник HTML, чтобы иметь эффект.

  5. это кажется, что 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.)