Problema in underscore.js con "new Function ()" quando viene impostata l'intestazione CSP

9

In underscore.js, il rendering del modello causa la violazione della proprietà 'unsafe-eval', con errore CSP alla riga seguente:

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

La soluzione a questo problema su alcuni forum è stata la sottolineatura di Sandbox in base alla documentazione di Chrome .

Ma come funzionerà questa soluzione per un'applicazione basata sul web dove ci sono molti utenti con browser diversi? Esistono soluzioni alternative a questo problema? Tieni presente che l'applicazione su cui sto lavorando è ampia e pesante, quindi il cambio del codice richiederà molto tempo.

    
posta hshantanu 06.05.2015 - 09:23
fonte

2 risposte

2

Da html5rocks , imposta il nonce nell'intestazione Content-Security-Policy:

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

Posiziona il nonce da qualche parte sulla tua pagina:

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

Chiama la funzione qui sotto con il valore nonce in questione prima di iniziare a usare il carattere di sottolineatura negli script.

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'));

Spero che ci sia un modo migliore di questo.

    
risposta data 02.10.2017 - 13:39
fonte
0

La soluzione suggerita da @Sand ha funzionato per me. Tuttavia, per rendere il tutto più autonomo in modo da poter inserire facilmente il codice in più pagine, ottengo il nonce dall'elemento script stesso.

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

Se c'è un problema con questo approccio fammelo sapere.

    
risposta data 16.01.2018 - 10:11
fonte

Leggi altre domande sui tag