Ответ 1
Существует несколько проблем:
-
Заголовки CSP не работают таким образом. CSP имеет только гранулярность единственной комбинации хоста и порта (источник). Если вы не можете разрешить script на своем хосте иметь
unsafe-eval
, то script может иметь его. Единственное возможное обходное решение - не использовать script, который требуетunsafe-eval
(удачи, написав замену MathJax самостоятельно). -
Синтаксис
allow
является старым вариантом Mozilla и не должен использоваться. Текущий синтаксис состоит в том, чтобы сказатьdefault-src
, за которым следуют схемы или имена узлов или истоки, которые разрешены как источник всего, а затем, если необходимо, переопределяют значение по умолчанию для каждого подтипа (например,script-src
). Некоторые источники могут поддерживать дополнительные ключевые слова источника в дополнение кself
. Например,script-src
поддерживаетunsafe-eval
, что означает, что любому script, которому в противном случае разрешено выполнение, разрешено запускать eval() или Function() иunsafe-inline
, что означает, что любая часть разметки, которая может поддерживать некоторые вид встроенного script разрешен. Разрешитьunsafe-eval
может быть приемлемым, ноunsafe-inline
почти не работает с script -src (в противном случае вы вообще не должны беспокоиться о CSP). -
Правильный синтаксис для
script-src
следующим образом:script-src 'self' 'unsafe-inline'
-
MathJax также использует встроенные атрибуты стиля, поэтому требуется следующее (если это уже разрешено), или MathJax попадет в
Exception
при попытке отобразить математику:style-src 'self' 'unsafe-inline'
Невозможно использовать CSP, чтобы позволить JS вставлять атрибуты стиля и не иметь атрибутов стиля, уже вставленных в источник HTML, чтобы иметь эффект.
-
Похоже, что Firefox 13.0 (по крайней мере) не сразу "звонит домой" в случае нарушения CSP. Большинство отчетов о нарушениях поступают через некоторое время после события. Chrome, похоже, гораздо более агрессивен с представлением отчета, которое будет немного легче протестировать. По моему опыту, Firefox не всегда отправляет отчет CSP вообще - он может использовать какую-то эвристику, чтобы не отправлять повторяющиеся сообщения.
Бонус: для поддержки webkit вам нужно повторить конфигурацию с X-WebKit-CSP
HTTP-заголовком.
В конце концов, чтобы MathJax работал с Content-Security-Protection, вам нужны следующие заголовки (предполагая, что вы распространяете библиотеку MathJax самостоятельно, а не через MNJMN):
X-Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; options eval-script
X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'
Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'
Здесь атрибут options
требуется для Firefox 13.0 и меньше. Я сообщил о проблеме CSP для MathJax на https://github.com/mathjax/MathJax/issues/256.