que parametros hace example evaluacion javascript security firefox mathjax content-security-policy

parametros - javascript>: eval



CSP: Cómo permitir inseguro-eval para un prefijo de URI dado(Firefox) (1)

Intento usar MathJax como parte de nuestra aplicación web que utiliza una Política de Seguridad de Contenidos (CSP) bastante estricta. El problema es que MathJax está codificado para usar eval() [para ser exactos, en forma de Function() ] que CSP no considera seguro por defecto.

Estoy usando el siguiente encabezado CSP actualmente:

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

Lo cual hace que el código de MathJax 2.0 falle porque usa la Function() . Traté de permitir insegura-eval (es decir, Function() ) solo para MathJax ubicado dentro del mismo origen debajo de path /:static/math/ . Para hacer eso, traté de agregar

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

para hacer que el encabezado completo se vea como

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 Firefox Web Console (ubicado en Herramientas - Desarrollador web):

[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, no recibo un informe CSP para el ''informe-uri''. (Como ve, 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 la static no son un error tipográfico, reservo todas las partes de la ruta comenzando con dos puntos para uso interno de la aplicación, todo el contenido del usuario puede definir libremente otras URL.)

¿Es incorrecto mi uso del atributo unsafe-eval o es imposible permitir eval-inseguro solo para el subconjunto de "self"? La intención es permitir evaluación insegura 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.


Hay múltiples problemas:

  1. Los encabezados de 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 usar un script que requiera unsafe-eval (buena suerte al escribir un reemplazo MathJax por su cuenta).

  2. La sintaxis allow es una variante antigua de Mozilla y no debe usarse. La sintaxis actual es decir default-src seguido de los nombres de esquema o de 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 admite unsafe-eval que significa que cualquier script que de otra forma se le permita ejecutar puede ejecutar eval () o Function (), y unsafe-inline lo que significa que cualquier parte de marcado que pueda soportar algún tipo de script en línea se permite ejecutar. Permitir unsafe-eval puede ser aceptable, pero unsafe-inline es prácticamente ir-no con script-src (de lo contrario, no debería molestarse con el CSP en absoluto).

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

    script-src ''self'' ''unsafe-inline''

  4. MathJax también utiliza atributos de estilo en línea, por lo que se necesita el seguimiento (a menos que ya esté permitido) o MathJax golpeará Exception s al tratar de representar las matemáticas:

    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 llama inmediatamente 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 envía un informe CSP: puede estar usando algún tipo de heurística para no enviar mensajes repetidos.

Bonificación: para admitir webkit, debe repetir la configuración con el encabezado HTTP de X-WebKit-CSP .

Al final, para que MathJax funcione con Content-Security-Protection, necesita los siguientes encabezados (suponiendo que esté distribuyendo la biblioteca MathJax usted mismo, en lugar de hacerlo a través del CDN de MathJax):

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í el atributo de options es obligatorio para Firefox 13.0 y menor. He informado el problema de CSP a MathJax en https://github.com/mathjax/MathJax/issues/256 .