2012-06-08 20 views
11

Estoy tratando de usar MathJax como parte de nuestra aplicación web que usa bastante estricto Content Security Policy (CSP). El problema es que MathJax está codificado para usar eval() [para ser exactos, en forma de Function()] que CSP no considera seguro por defecto.CSP: Cómo permitir inseguro-eval para un prefijo de URI dado (Firefox)

estoy usando actualmente siguiente cabecera CSP:

X-Content-Security-Policy: allow 'self'; img-src *; media-src *; frame-src *; font-src *; frame-ancestors 'none'; style-src *; report-uri '/:save-csp-violation'; 

¿Qué hace que el código mathjax 2.0 a fallar, ya que utiliza Function(). Intenté permitir eval-inseguro (es decir, Function()) solo para MathJax ubicado dentro del mismo origen debajo de la ruta /:static/math/. Para hacer eso, he intentado añadir

unsafe-eval '/:static/math/*' 

para hacer la cabecera completa parezca

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/*' 

pero todavía no puedo Firefox 13.0 para ejecutar el código. Recibo un mensaje de error a la consola web Firefox (que se encuentra en Herramientas - 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 

Sin embargo, ahora no recibo un informe a la CSP 'reportar-uri'. (Como puede ver, actualmente estoy ejecutando la prueba a través del puerto localhost personalizado sin SSL, en caso de que eso marque la diferencia. Los dos puntos antes de static no son un error tipográfico, reservo todas las partes de ruta comenzando con dos puntos para uso interno de la aplicación, todo el contenido del usuario puede definir libremente otras URL.)

¿Es incorrecto el uso del atributo unsafe-eval o es imposible permitir inseguro-eval solo para el subconjunto de "self"? La intención es permitir eval-inseguro solo para el mismo prefijo de ruta de origen /:static/math, ejecución estricta de código CSP JS para 'self' y ningún código JS para ningún otro método.

Respuesta

13

No tenemos varias cuestiones: cabeceras

  1. CSP no funcionan de esta manera. CSP solo tiene la granularidad de una sola combinación de host + puerto (origen). Si no puede permitir que ningún script en su host tenga unsafe-eval, ningún script puede tenerlo. La única solución posible es no utilizar una secuencia de comandos que requiera unsafe-eval (buena suerte escribiendo usted mismo un reemplazo MathJax).

  2. La sintaxis allow es una variante antigua de Mozilla y no debe utilizarse. La sintaxis actual es default-src seguido de los nombres de sistema o host u orígenes que están permitidos como fuente de todo y luego anula el valor predeterminado para cada subtipo (por ejemplo, script-src) según sea necesario. Algunas fuentes pueden admitir palabras clave de origen adicionales además de self. Por ejemplo, el script-src es compatible con unsafe-eval, lo que significa que cualquier script que se permita ejecutar puede ejecutar eval() o Function() y unsafe-inline, lo que significa que cualquier parte de marcado que pueda admitir algún tipo de script en línea puede ejecutarse . Permitir unsafe-eval puede ser aceptable, pero unsafe-inline es prácticamente inútil con script-src (de lo contrario, no debería molestarse en absoluto con el CSP).

  3. La sintaxis correcta para script-src de la siguiente manera:

    script-src 'self' 'unsafe-inline' 
    
  4. mathjax también utiliza estilo en línea atributos por lo que se necesita lo siguiente (a menos que ya permitía) o mathjax llegará a Exception s al tratar de hacer los cálculos:

    style-src 'self' 'unsafe-inline' 
    

    No es posible usar CSP para permitir que JS inserte atributos de estilo y no tenga atributos de estilo ya insertados en la fuente HTML para tener un efecto.

  5. Parece que Firefox 13.0 (al menos) no inmediato "llamar a casa" en caso de violación de CSP. La mayoría de los informes de infracción se envían un tiempo después del evento. Chrome parece ser mucho más agresivo con la presentación del informe, lo que hará que sea un poco más fácil contrastar. Desde mi experiencia, Firefox no siempre enviar informe CSP en absoluto - puede estar utilizando algún tipo de heurística para no enviar mensajes repetidos.

Bonus: Para apoyar webkit, hay que repetir la configuración con X-WebKit-CSP cabecera HTTP.

Al final, para hacer el trabajo mathjax con contenido-Seguridad-Protección, necesita los siguientes encabezados (asumiendo que usted está distribuyendo biblioteca mathjax por sí mismo, en lugar de a través de la mathjax CDN):

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' 

Aquí se requiere el atributo options para Firefox 13.0 y menor. He informado el problema de CSP a MathJax al https://github.com/mathjax/MathJax/issues/256.

+1

Firefox 13.0 también contiene un error o característica que falta que es cabecera CSP no coincide con la variante del W3C. Ver el error aquí: https://bugzilla.mozilla.org/show_bug.cgi?id=746978 –

Cuestiones relacionadas