<p>MathJax требует небезопасной «Политики безопасности контента»</p>

Созданный на 11 июн. 2012  ·  42Комментарии  ·  Источник: mathjax/MathJax

Текущая реализация MathJax использует следующие функции, которые не считаются безопасными в современном мире и не могут использоваться с заголовками Content-Security-Policy по умолчанию (http://www.w3.org/TR/CSP/):

  • JavaScript-вычисление строк (новая функция() со строкой или eval()) (1)
  • Атрибуты встроенного стиля, вставленные через JavaScript (2)

Спорный вопрос, следует ли исправить проблему (2), но по крайней мере (1) следует исправить, потому что Content-Security-Policy не имеет достаточной детализации, чтобы позволить MathJax выполняться как доверенный скрипт и в то же время не интерпретировать любой другой JavaScript. файл как особо доверенный. В настоящее время, если кто-то хочет использовать MathJax, он должен разрешить eval() везде. Проблема (1) также вызывает ошибку № 130 (MathJax несовместим со строгим режимом ECMAScript 5).

В настоящее время единственный способ заставить MathJax работать, даже если используется локально установленный код MathJax, — это использовать следующие HTTP-заголовки CSP (устаревший заголовок «options» включен в Firefox 13.0 и ниже):

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'

Эти заголовки позволят некоторой защите, предоставляемой CSP, и по-прежнему позволят MathJax работать, если MathJax распространяется из того же источника, что и содержимое страницы.

Accepted Fixed Test Not Needed v2.4

Самый полезный комментарий

@kaushalmodi , см. мой комментарий выше о том, как избежать проблемы, или мой комментарий к проблеме, на которую вы ссылаетесь. Вам нужно изменить способ настройки MathJax, если вы используете CSP, который ограничивает выполнение скриптов.

Все 42 Комментарий

небезопасный eval также является большой проблемой для меня. Очень скоро Chrome заставит все расширения принять политику безопасности контента , запрещающую использование eval . В настоящее время мы пытаемся обновить Readium , чтобы он соответствовал этому, но мы не можем использовать MathJax.

+1

Спасибо, парни. Мы рассмотрим это.

Просто предварительное обновление. Кажется, можно исправить некоторые проблемы достаточно скоро (надеюсь, достаточно для магазина Chrome). Однако мы не уверены, как пострадает производительность — что, как вы можете догадаться, может быть плохим. Мы будем держать вас в курсе, когда @dpvc сможет изучить это более подробно и, возможно, создать несколько экспериментальных веток.

Если у вас есть дополнительные комментарии, вопросы и предложения по конкретному коду, сообщите нам об этом.

Я потратил немного времени, изучая его сам. Похоже, вам, ребята, нужно прекратить преждевременную оптимизацию. Оценка строки НЕ быстрее, чем создание замыкания.

Кроме того, вам не следует запускать eval() на каждой странице, загружающей Mathjax, только для того, чтобы проверить, можете ли вы запустить eval() . В принципе, это нужно пройти.

Вызовы new Function() предназначены не для скорости, а для памяти. new Function() не создает замыкание и поэтому не удерживает локальную область. Поскольку это лежит в основе модели объектно-ориентированного программирования и используется множество объектов, это может повлиять на использование памяти. Я не тестировал это в последних браузерах.

Что касается использования eval , MathJax использует его для обработки своих встроенных блоков конфигурации, и на данный момент его нельзя легко заменить. Таким образом, «безопасная» версия MathJax должна будет использовать внешние файлы конфигурации (что не должно быть проблемой и, вероятно, в любом случае больше соответствует политике безопасности). Вызов eval , на который вы ссылаетесь, предназначен не для определения возможности запуска eval , а для определения того, работает ли он в глобальном пространстве имен (что не во всех браузерах). Я знаю, что это нужно будет удалить для версии, которая будет работать с вашими потребностями в безопасности.

Это не то, как замыкания работают в javascript. Вы не держитесь за все в локальной области; вы фиксируете только то, что использует ваша функция. Ваша функция CONSTRUCTOR ничего не использует из локальной области видимости, создание замыкания не требует затрат. Это преждевременная оптимизация проблемы, которой никогда не существовало.

Что касается eval , я считаю, что вы не должны запускать код на странице, если вам это не нужно, особенно если этот код использует небезопасный eval() . Вы используете эту функцию EVAL только в том случае, если Mathjax был включен во встроенную конфигурацию, поэтому не запускайте для нее тест, пока он вам не понадобится. Но действительно, с какой стати конфигурация должна быть исполняемым кодом. На самом деле это просто кусок JSON, который передается в функцию. Почему бы просто не передать JSON, проанализировать его и заставить MathJAX вызвать функцию?

Это не то, как замыкания работают в javascript. Вы не держитесь за все в локальной области; вы фиксируете только то, что использует ваша функция.

Я не думаю, что все так однозначно. Во-первых, это было _не_ в 2008 году, когда была написана эта часть кода. Я только что провел тесты сегодня утром, которые, по-видимому, подтверждают, что версии Safari, Firefox, Opera и IE, работавшие в то время, работали так, как я описал (полная цепочка областей видимости была сохранена в замыкании, независимо от используемых переменных). ). Сайт, на который я ссылаюсь, похоже, не работает сегодня утром (был вчера), поэтому я не могу проверить детали, но насколько я помню, это было частью спецификации ECMAScript 262.

Текущие версии Safari, Chrome, Firefox и IE работают так, как вы описываете, поэтому с тех пор что-то изменилось. Похоже, что изменения произошли в Safari 4, Firefox 3.6 и IE9; У меня нет старых версий Chrome для тестирования, поэтому я не знаю их историю. IE8 ведет себя по-старому, а Opera 12 — по-прежнему. Я не проверял мобильные устройства. Некоторые из этих браузеров находятся в списке поддержки MathJax, так что это все еще проблема, которую мы должны учитывать для MathJax в целом. Конечно, я уверен, что что-то можно придумать для ваших нужд.

Что касается данных JSON, блок конфигурации может быть больше, чем просто вызов MathJax.Hub.Config() . Например, вы можете установить прослушиватели событий или добавить функции во входной jax TeX для реализации дополнительных команд и так далее. Они не могут быть частью данных JSON, поскольку содержат исполняемый код. Эта функция не всегда используется, но она определенно используется реальными веб-сайтами. Кроме того, не все целевые браузеры имеют встроенную библиотеку JSON, поэтому для синтаксического анализа потребуются дополнительные библиотеки. (Конечно, это не непреодолимо, но нужно загрузить больше кода.)

+1 за изменение этого, так что (среди прочего) Github снова разрешит MathJax в своих вики.

@ketch , у вас есть ссылка на Github, делающую заявление по этому поводу? Я не понимаю, как эта проблема касается безопасности Github Wiki.

@pkra Я точно не знаю, что это причина, но я считаю, что это так. На это меня натолкнули комментарии на этой странице:

http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-страницы

И посмотреть

https://github.com/blog/1477-content-security-policy

Я считаю, что поддержка MathJax исчезла одновременно с внедрением функции CSP.

Спасибо, это интересно. Я не уверен, что они связаны, но кто знает — команда github никогда публично не обсуждала, почему они удалили MathJax. Было бы прискорбно, если бы причиной было что-то, что на самом деле не является проблемой для их установки.

+1 за соблюдение CSP.

+1

Я прочитал эту ветку и нашел ее очень информативной и довольно беспристрастной. Я собираюсь сделать ставку на то, что они [github] предотвратят что-то вроде exec, CSP по вопросам безопасности и не допустят этого.

Помимо того, что меня озадачивает этот пример кода и ваши мифические компьютерные знания о прошлых версиях, я тем не менее нахожу это очень интересным и считаю, что функция должна быть доступна для ее дальнейшего использования, хотя она не должна мешать счастливой жизни. путь использования MathJAX в сфере безопасности.

Кстати, я написал в службу поддержки Github по электронной почте о том, почему они отказались от MathJax. Вот ответ:

CSP была одной из причин. Другие причины включали проблемы с производительностью и сложное обслуживание. Мы могли бы подумать о том, чтобы добавить его обратно, если бы устранили причины, побудившие нас удалить его, но я не могу этого обещать.

Спасибо @ketch , это приятно знать.

@dpvc мы должны добавить это к следующей вехе?

:+1:

@pkra , я планировал добавить это. Просто еще не опустился так далеко в численном списке.

@dpvc правильно. В основном мне было интересно, потребуются ли для исправления этого значительные изменения (особенно в отношении встроенных конфигураций), т. е. форсированный скачок версии.

Изменения, которые мы внесли, чтобы разрешить настройку через переменную MathJax, должны сделать возможным ее включение без прыжка. Я почти уверен, что смогу сделать это с обратной совместимостью и без необходимости создавать отдельную «безопасную» версию MathJax.js. Конечно, во время разработки может появиться что-то, что поставит крест на работе; ничего из этого еще не написано и не протестировано.

+1 за обеспечение безопасности MathJax. Жаль, что нельзя использовать эту замечательную библиотеку в производстве из-за проблем с безопасностью.

Есть ли прогресс в этом вопросе? Я пытаюсь программно внедрить MathJax на страницы с расширением Chrome, и я натыкаюсь если не на кирпичную стену, то, по крайней мере, на прилично прочную стену. Как описано в emichael/textthings#4, моя самая большая проблема сейчас связана с MathJax.js:265 . Я смог исключить звонки на

new Function()

довольно легко, превратив их в замыкания, как описано выше, но я понятия не имею, как обойти это, используя eval или встроенный скрипт.

РЕДАКТИРОВАТЬ: в итоге я дал пользователю возможность добавить unsafe-eval и unsafe-inline в CSP, но было бы неплохо долгосрочное исправление для перевода MathJax в безопасный CSP. :+1:

@emichael , мы планируем включить изменения в следующий выпуск (запланировано на следующий месяц), но я еще их не внес. Одна из причин заключается в том, что я не изучал, как вы на самом деле тестируете это (как настроить среду, которая требует этого). Если бы вы могли дать мне совет, где искать или какой может быть минимальная среда тестирования, это помогло бы.

Кроме того, ошибка об eval возникает во время выполнения или во время компиляции? То есть, происходит ли это, если MathJax.js просто включает вызов eval, даже если он никогда не используется, или это происходит только при попытке выполнить eval? Мое прочтение спецификации предполагает, что это должна быть ошибка времени выполнения, что улучшит мою ситуацию, но я подумал, что вы можете знать ответ.

Если у вас есть тестовый сервер, вы можете просто установить Content-Security-Policy в заголовках ответа. Просто убедитесь, что script-src не включает 'unsafe-eval' или 'unsafe-inline' (сам GitHub является хорошим примером). Если вы этого не сделаете, вы можете использовать очень минимальное расширение Chrome для самостоятельного внедрения заголовков.

Это ошибка времени выполнения.

Спасибо. Я посмотрю что я могу сделать.

Команда eval используется только для обработки встроенных блоков конфигурации (и есть начальная команда для проверки того, как в этом случае обрабатываются глобальные переменные). Первоначальный можно отложить до использования встроенной конфигурации, и если вы избегаете использования встроенной конфигурации, то это должно позаботиться об этом. В v2.3 мы добавили новый способ выполнения встроенной настройки без eval (при подготовке к решению этой проблемы), так что вы по-прежнему можете включать конфигурацию MathJax в HTML-файлы, не запуская вызов eval.

Хорошо, я сделал патч, который удаляет вызовы new Function() и eval() . Он основан на последней ветке разработки, но изменения, перечисленные в f220993, также должны быть внесены в основную копию MathJax.js , если вам это нужно. Вам нужно разрешить встроенные стили (от этого никуда не деться). Существует также ссылка на шрифт about:blank , чтобы MathJax мог проверить реакцию на отсутствующий шрифт (без доступа к сети), поэтому вы можете добавить about: к font-src тоже. Как только я изменил эти два, эта копия MathJax заработала без сучка и задоринки.

Хороший! Я понимаю, почему вам определенно нужны 'unsafe-inline' для стилей.

Что касается разрешения script-src 'unsafe-inline' , если я вас правильно понимаю, скрипты всегда встроены только тогда, когда пользователь включает встроенную конфигурацию MathJax для начала. Это было бы хорошо, так как все могло бы работать и без 'unsafe-inline' в script-src . Однако это должно быть упомянуто в документах.

Ваше понимание встроенных скриптов верное. Вам не нужно script-src 'unsafe-inline' , если только вы не используете встроенные блоки конфигурации, которые вам не нужны. Вы можете использовать либо локальный файл конфигурации MathJax (добавленный в config= ), либо обычный файл сценария, который устанавливает переменную MathJax в объект, который вы обычно передаете в MathJax.Hub.Config() и загрузите этот файл _перед_ вашим скриптом, загружающим MathJax.js. Например, положить

var MathJax = {
  tex2jax: {
    inlineMath: [['$','$'],['\\(','\\)']],
    procesEscapes: true
  }
};

в файл с именем mathjax-config.js , а затем

<script src="mathjax-config.js"></script>
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML"></script>

Я надеюсь, что это позаботится о ваших требованиях.

Это действительно так. Благодарю за быстрое исправление!!

Здесь есть те, кто скажет, что это было не так уж и быстро (проблема была открыта два года!), но я отметил ее для следующего релиза, и все равно только приступал к ней, поэтому ваш комментарий пришел по адресу подходящее время.

=> Объединено.

так кто-нибудь уже просил github разрешить mathjax? по-прежнему невозможно написать файл dotjs, который позволяет мне писать tex в задачах github, чтобы отображать с помощью mathjax...

(пример здесь - http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages - не работает.)

Привет,

В настоящее время я размещаю сайт jekyll на страницах github и следую этой статье и добавил следующее в свой файл include:

<script type="text/javascript"
  src="//cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>

Который должен работать с https или http. Однако при загрузке моего блога в браузере с https везде он выглядит испорченным, пока вы не нажмете, чтобы разрешить небезопасный сценарий. Как я могу это исправить?

@silky ничего особенного, AFAWK. Я думаю, что на стороне клиента это маловероятно, но MathJax-node может предоставить продуктивную альтернативу.

@diego898 Общие вопросы лучше подходят по адресу http://groups.google.com/forum/#!forum/mathjax -users; всегда включайте ссылку на живую страницу, особенности браузера и ОС и т. д. Спасибо.

@pkra Я понимаю, что просто не был уверен, была ли это ошибка, связанная с этой проблемой, или проблема с конфигурацией с моей стороны.

@diego898 без проблем. То, что вы описываете, похоже, не имеет отношения к этой проблеме.

Я все еще вижу эту проблему. См . https://github.com/mathjax/MathJax/issues/1988.

@kaushalmodi , см. мой комментарий выше о том, как избежать проблемы, или мой комментарий к проблеме, на которую вы ссылаетесь. Вам нужно изменить способ настройки MathJax, если вы используете CSP, который ограничивает выполнение скриптов.

Был ли когда-либо решен (2) в исходной проблеме? Кажется, что mathjax v3 все еще вставляет

Была ли эта страница полезной?
0 / 5 - 0 рейтинги