<p>MathJax requiere una "Política de seguridad de contenido" insegura</p>

Creado en 11 jun. 2012  ·  42Comentarios  ·  Fuente: mathjax/MathJax

La implementación actual de MathJax usa las siguientes funciones que no se consideran seguras en el mundo moderno y no se pueden usar con los encabezados predeterminados de Content-Security-Policy (http://www.w3.org/TR/CSP/):

  • Evaluación JavaScript de cadenas (nueva función() con una cadena o eval()) (1)
  • Atributos de estilo en línea insertados a través de JavaScript (2)

Es discutible si el problema (2) debe solucionarse, pero al menos (1) debe solucionarse porque Content-Security-Policy no tiene suficiente granularidad para permitir que MathJax se ejecute como un script de confianza y, al mismo tiempo, no interprete todos los demás JavaScript. archivo como especialmente confiable. Actualmente, si uno quiere usar MathJax, debe permitir eval() en todas partes. El problema (1) también provoca el error n.º 130 (MathJax es incompatible con el modo estricto de ECMAScript 5).

Actualmente, la única forma de hacer que MathJax funcione, incluso si se usa el código MathJax instalado localmente, es usar los siguientes encabezados CSP HTTP (el encabezado obsoleto de "opciones" se incluye para Firefox 13.0 y versiones anteriores):

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'

Estos encabezados permitirán cierta protección provista por CSP y aún permitirán que MathJax funcione, si MathJax se distribuye desde el mismo origen que el contenido de la página.

Accepted Fixed Test Not Needed v2.4

Comentario más útil

@kaushalmodi , vea mi comentario anterior sobre cómo evitar el problema, o mi comentario sobre el problema al que se vincula. Debe cambiar la forma en que configura MathJax si está utilizando un CSP que restringe la ejecución de scripts.

Todos 42 comentarios

La evaluación insegura también es un gran problema para mí. Muy pronto, Chrome obligará a todas las extensiones a adoptar una política de seguridad de contenido que prohíba el uso de eval . Actualmente estamos tratando de actualizar Readium para cumplir con esto, pero no podemos hacerlo y usar MathJax.

+1

Gracias chicos. Lo investigaremos.

Sólo una actualización preliminar. Parece posible solucionar algunos de los problemas lo suficientemente pronto (con suerte, lo suficiente para la tienda Chrome). Sin embargo, no estamos seguros de cómo se verá afectado el rendimiento, lo que, como puede suponer, podría ser malo. Lo mantendremos informado cuando @dpvc pueda ver esto con más detalle y tal vez crear algunas ramas experimentales.

Si tiene comentarios, preguntas y sugerencias adicionales sobre un código específico, háganoslo saber.

Pasé un poco de tiempo buscándolo yo mismo. Parece que ustedes deben detenerse con la optimización prematura. Evaluar una cadena NO es más rápido que crear un cierre.

Además, no debería ejecutar eval() en cada página que carga Mathjax solo para verificar si puede ejecutar eval() . Básicamente, esto tiene que desaparecer.

Las llamadas new Function() no son por velocidad sino por memoria. El new Function() no crea un cierre y, por lo tanto, no se aferra al alcance local. Dado que esto es el corazón del modelo de programación orientada a objetos, y hay muchos objetos en uso, podría tener un impacto en el uso de la memoria. No he hecho ninguna prueba de eso en navegadores recientes.

En cuanto al uso de eval , MathJax lo usa para manejar sus bloques de configuración en línea, y eso no podría reemplazarse fácilmente en este punto. Entonces, una versión "segura" de MathJax necesitaría usar archivos de configuración externos (lo que no debería ser un problema, y ​​​​probablemente esté más en línea con la política de seguridad de todos modos). La llamada eval a la que se refiere no es para determinar si se puede ejecutar eval , sino para determinar si se ejecuta en el espacio de nombres global (que no es el caso en todos los navegadores). Soy consciente de que esto debería eliminarse para una versión que funcione con sus necesidades de seguridad.

Así no es como funcionan los cierres en javascript. No te aferras a todo en el ámbito local; solo captura cosas que usa su función. Su función CONSTRUCTOR no usa nada del alcance local, no hay costo para crear el cierre. Esta es una optimización prematura para un problema que nunca existió.

En lo que respecta a eval , mi punto es que no debe ejecutar código en una página si no es necesario, especialmente si ese código usa eval() inseguro. Solo usa esa función EVAL si Mathjax se ha incluido con la configuración en línea, así que no ejecute la prueba hasta que lo necesite. Pero realmente, ¿por qué demonios la configuración tiene que ser un código ejecutable? En realidad, es solo una parte de JSON que se pasa a la función. ¿Por qué no simplemente pasar el JSON, analizarlo y hacer que MathJAX llame a la función?

Así no es como funcionan los cierres en javascript. No te aferras a todo en el ámbito local; solo captura cosas que usa su función.

No creo que las cosas estén tan claras como eso. Primero, este _no_ era el caso en 2008 cuando se escribió esa parte del código. Acabo de realizar pruebas esta mañana que parecen confirmar que las versiones de Safari, Firefox, Opera e IE en juego en ese momento funcionaron de la manera que describí (la cadena de alcance completa se mantuvo en un cierre, independientemente de las variables utilizadas ). El sitio que es mi referencia para esto parece estar inactivo esta mañana (estuvo activo ayer), por lo que no puedo verificar los detalles, pero recuerdo que esto era parte de la especificación ECMAScript 262.

Las versiones actuales de Safari, Chrome, Firefox e IE parecen funcionar como usted describe, por lo que en algún momento desde entonces las cosas han cambiado. Parece que Safari 4, Firefox 3.6 e IE9 fueron donde ocurrió el cambio; No tengo versiones antiguas de Chrome para probar, así que no conozco el historial allí. IE8 tiene el comportamiento anterior y Opera 12 todavía lo tiene. No he comprobado los dispositivos móviles. Algunos de estos navegadores están en la lista de soporte de MathJax, por lo que sigue siendo un problema que debemos considerar para MathJax en general. Por supuesto, estoy seguro de que algo se puede resolver para sus necesidades.

En cuanto a los datos JSON, el bloque de configuración puede ser más que una simple llamada MathJax.Hub.Config() . Por ejemplo, puede instalar detectores de eventos o agregar funciones a la entrada jax de TeX para implementar comandos adicionales, etc. Estos no pueden ser parte de los datos JSON porque incluyen código ejecutable. Esta característica no siempre se usa, pero ciertamente _está_ siendo utilizada por sitios web reales. Además, no todos los navegadores de destino tienen una biblioteca JSON integrada, por lo que sería necesario contar con bibliotecas adicionales para realizar el análisis. (Ciertamente no es insuperable, pero hay más código para descargar).

+1 por cambiar esto, para que (entre otras cosas) Github permita MathJax en sus wikis nuevamente.

@ketch , ¿tiene una referencia para que Github haga una declaración al respecto? No veo cómo este problema toca la seguridad de Github Wiki.

@pkra No estoy seguro de que esta sea la causa, pero creo que es así. Fui llevado a esto por los comentarios en esta página:

http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages

Y ver

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

Creo que el soporte de MathJax desapareció al mismo tiempo que implementaron la función CSP.

Gracias, eso es interesante. No estoy seguro de que los dos estén relacionados, pero quién sabe: el equipo de github nunca discutió públicamente por qué eliminaron MathJax. Sería desafortunado si algo que en realidad no es un problema para su configuración hubiera sido la razón.

+1 por cumplir con CSP.

+1

Leí este hilo y lo encontré muy informativo y bastante imparcial. Voy a apostar mi afirmación de que ellos [github] evitarían algo como exec, CSP en cuestiones de seguridad y no lo permitirían.

Además de estar desconcertado por esa muestra de código y su mítica tradición informática de versiones anteriores, lo encuentro muy interesante y tomo la posición de que una característica debería estar disponible para su uso continuo, aunque no debería interferir con el feliz ruta de uso de MathJAX en el mundo preocupado por la seguridad.

Por cierto, envié un correo electrónico al soporte de Github sobre por qué abandonaron MathJax. Aquí está la respuesta:

La CSP fue una de las razones. Otras razones incluyeron problemas de rendimiento y mantenimiento duro. Podríamos considerar agregarlo nuevamente si eliminamos las razones que nos llevan a eliminarlo, pero no puedo prometerlo.

Gracias @ketch , es bueno saberlo.

@dpvc , ¿deberíamos agregar esto al próximo hito?

:+1:

@pkra , estaba planeando agregarlo. Simplemente no había llegado tan abajo numéricamente en la lista todavía.

@dpvc cierto. Principalmente me preguntaba si arreglar esto requeriría cambios significativos (especialmente las configuraciones en línea wrt), es decir, forzar un salto de versión.

Los cambios que hicimos para permitir la configuración a través de la variable MathJax deberían hacer posible incluirla sin un salto. Estoy bastante seguro de que puedo hacerlo con compatibilidad con versiones anteriores y sin tener que crear una versión "segura" separada de MathJax.js. Por supuesto, algo podría aparecer durante el desarrollo que arrojaría una llave inglesa en las obras; nada de esto está escrito o probado todavía.

+1 por hacer que MathJax sea seguro. Lástima no poder usar esta bonita biblioteca en producción debido a problemas de seguridad.

¿Algún progreso en este tema? Estoy tratando de inyectar programáticamente MathJax en páginas con una extensión de Chrome, y estoy golpeando, si no una pared de ladrillos, al menos una pared decentemente sólida. Como se describe en emichael/textings#4, mi mayor problema ahora es con MathJax.js:265 . Pude eliminar las llamadas a

new Function()

con bastante facilidad convirtiéndolos en cierres como se describe anteriormente, pero no tengo idea de cómo usar eval o un script en línea.

EDITAR: terminé dando al usuario la opción de agregar unsafe-eval y unsafe-inline al CSP, pero sería bueno una solución a largo plazo para llevar MathJax a un CSP seguro. :+1:

@emichael , planeamos incluir los cambios en el próximo lanzamiento (planeado para el próximo mes), pero aún no los he hecho. Una de las razones es que no he investigado cómo realmente prueba esto (cómo configurar el entorno que lo requiere). Si pudiera darme una sugerencia de dónde buscar o cuál podría ser un entorno de prueba mínimo, eso ayudaría.

Además, ¿el error sobre la evaluación ocurre en tiempo de ejecución o en tiempo de compilación? Es decir, ¿ocurre si MathJax.js simplemente incluye una llamada a eval, incluso si nunca se usa, o solo sucede cuando se intenta realmente eval? Mi lectura de la especificación sugiere que debería ser un error de tiempo de ejecución, lo que mejoraría las cosas para mí, pero pensé que podría saber la respuesta.

Si tiene un servidor de prueba, simplemente puede configurar Content-Security-Policy en los encabezados de respuesta. Solo asegúrese de que script-src no incluya 'unsafe-eval' o 'unsafe-inline' (GitHub en sí mismo es un buen ejemplo). Si no lo hace, puede usar una extensión de Chrome mínima para inyectar los encabezados usted mismo.

Es un error de tiempo de ejecución.

Gracias. Veré lo que puedo hacer.

El comando eval solo se usa para procesar los bloques de configuración en línea (y hay uno inicial para probar cómo se manejan las variables globales en ese caso). El inicial se puede posponer hasta que se use una configuración en línea, y si evita usar la configuración en línea, eso debería resolverlo. En v2.3, agregamos una nueva forma de realizar la configuración en línea sin evaluación (en preparación para resolver este problema), por lo que aún puede incluir la configuración de MathJax dentro de los archivos HTML sin activar la llamada de evaluación.

Bien, hice un parche que elimina las llamadas new Function() y eval() . Se basa en la rama de desarrollo más reciente, pero los cambios enumerados en f220993 también deberían poder realizarse en la copia maestra de MathJax.js , si necesita hacerlo. Debe permitir estilos en línea (realmente no hay forma de evitarlo). También hay una referencia de fuente a about:blank para que MathJax pueda probar la respuesta a una fuente faltante (sin tener que acceder a la red), por lo que es posible que desee agregar about: a font-src también. Una vez que cambié esos dos, esta copia de MathJax funcionó sin problemas.

¡Bonito! Puedo ver por qué definitivamente necesitas 'unsafe-inline' para estilos.

En lo que respecta al permiso script-src 'unsafe-inline' , si lo entiendo correctamente, los scripts solo se alinean cuando el usuario incluye la configuración de MathJax en línea para comenzar. Esto estaría bien, ya que todo podría funcionar sin 'unsafe-inline' en script-src . Sin embargo, debe mencionarse en los documentos.

Su comprensión acerca de los scripts en línea es correcta. No necesita script-src 'unsafe-inline' a menos que esté usando bloques de configuración en línea, que no necesita usar. Puede usar un archivo de configuración MathJax local (agregado a config= ) o puede usar un archivo de script normal que establece la variable MathJax en un objeto que normalmente pasaría a MathJax.Hub.Config() y cargue ese archivo _antes_ de su secuencia de comandos que carga MathJax.js. Por ejemplo, poner

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

en un archivo llamado mathjax-config.js y luego

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

Espero que eso se ocupe de sus requisitos.

De hecho, lo hace. ¡¡Gracias por la solución rápida!!

Hay algunos aquí que dirían que no fue tan rápido (¡el problema ha estado abierto durante dos años!), pero lo tenía marcado para la próxima versión, y de todos modos estaba llegando a eso, por lo que su comentario llegó a el tiempo apropiado.

=> Fusionado.

Entonces, ¿alguien le ha pedido a github que permita mathjax? Todavía no es posible escribir un archivo dotjs que me permita escribir tex en problemas de github para renderizar con mathjax...

(el ejemplo aquí - http://stackoverflow.com/questions/16889421/how-to-insert-javascript-to-enable-mathjax-on-github-wiki-pages - falla).

Hola,

Actualmente estoy alojando un sitio de jekyll en páginas de github y siguiendo este artículo , y he agregado lo siguiente a mi archivo de inclusión:

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

Que se supone que funciona con https o http. Sin embargo, al cargar mi blog en un navegador con https en todas partes, parece desordenado hasta que hace clic para permitir el script no seguro. ¿Cómo puedo arreglar esto?

@silky nada específico AFAWK. Creo que el lado del cliente es poco probable, pero MathJax-node podría proporcionar una alternativa productiva.

@diego898 Las preguntas generales encajan mejor en http://groups.google.com/forum/#!forum/mathjax -users; siempre incluya un enlace a una página en vivo, navegador y detalles del sistema operativo, etc. Gracias.

@pkra Entiendo que no estaba seguro de si se trataba de un error relacionado con este problema o de un problema de configuración de mi parte

@diego898 no hay problema. Lo que describes no parece estar relacionado con este problema.

Todavía estoy viendo este problema. Consulte https://github.com/mathjax/MathJax/issues/1988.

@kaushalmodi , vea mi comentario anterior sobre cómo evitar el problema, o mi comentario sobre el problema al que se vincula. Debe cambiar la forma en que configura MathJax si está utilizando un CSP que restringe la ejecución de scripts.

¿Se resolvió alguna vez (2) en el problema original? Parece que mathjax v3 todavía inserta

¿Fue útil esta página
0 / 5 - 0 calificaciones