Problema en underscore.js con "nueva función ()" cuando se establece el encabezado CSP

10

En underscore.js, la representación de la plantilla provoca la violación de la propiedad 'unsafe-eval', con un error de CSP en la siguiente línea:

render = new Function(settings.variable || 'obj', '_', source);

La solución a esto en algunos foros ha sido el subrayado de Sandbox según la documentación de Chrome .

¿Pero cómo funcionará esta solución para una aplicación basada en web donde hay varios usuarios con diferentes navegadores? ¿Hay alguna solución alternativa a este problema? Tenga en cuenta que la aplicación en la que estoy trabajando es grande y pesada, por lo que el cambio de código llevará mucho tiempo.

    
pregunta hshantanu 06.05.2015 - 09:23
fuente

2 respuestas

2

De html5rocks , establece el nonce en el encabezado de Política de Seguridad de Contenido:

Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'

Coloque el nonce en algún lugar de su página:

...
<body data-nonce="EDNnf03nceIOfn39fn3e9h3sdfa">
...

Llame a la siguiente función con el valor de nonce en cuestión antes de comenzar a usar el guión bajo en sus scripts.

function handleFnNonceRequirement(nonce) {
    window.Function = function () {
        var renderNode = document.createElement("script"),
            len = arguments.length,
            source = arguments[len-1],
            args = [];

        if ( 1 < len ) {
            for ( var i=0; i<(len-1); i++ ) {
                args.push(arguments[i]);
            }
        }

        renderNode.text = "function __ifYouAbsolutelyMustUseIt() { return function("+args.join(", ")+") {" + source + "}}";
        renderNode.setAttribute('nonce', nonce);

        document.head.appendChild(renderNode).parentNode.removeChild(renderNode);
        return __ifYouAbsolutelyMustUseIt();
    };
}

handleFnNonceRequirement(document.getElementsByTagName("BODY")[0].getAttribute('data-nonce'));

Espero que haya una mejor manera que esta.

    
respondido por el Sand 02.10.2017 - 13:39
fuente
0

La solución sugerida por @Sand funcionó para mí. Sin embargo, para hacer que todo sea más autónomo para poder colocar el código en varias páginas fácilmente, obtengo el nonce del elemento script .

<script type="text/javascript" id="noncense" nonce="...">
   function handleFnNonceRequirement(nonce) {
    .
    .
    .
   }
   handleFnNonceRequirement($("#noncense")[0].nonce);
</script>

Si hay un problema con este enfoque, hágamelo saber.

    
respondido por el Sushil 16.01.2018 - 10:11
fuente

Lea otras preguntas en las etiquetas