19

ho un errore:estensione Chrome "ha rifiutato di valutare una stringa come JavaScript perche 'non sicuro-eval'

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:" . Either the 'unsafe-inline' keyword, a hash ('sha256-...'), or a nonce ('nonce-...') is required to enable inline execution.

chrome-extension://ldbpohccneabbobcklhiakmbhoblcpof/popup.html:1

Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self' chrome-extension-resource:" .

il codice popup.js

$(document).ready(function() { 
    $.getJSON('http://.......alerts.json', function(data) { 
     alert('HELLO'); 
     }); 
}); 

manifesto:

{ 
    "manifest_version": 2, 

    "name": "Alert", 
    "description": "This extension for .", 
    "version": "2.0", 
    "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", 
    "permissions": [ 
    "http://www.......il/" 
    ], 
    "browser_action": { 
    "default_icon": "icon.png", 
    "default_popup": "popup.html" 
    }, 
    "content_scripts": [ { 
    "js": [ "jquery.min.js", "popup.js" ], 
    "matches": [ "http://*/*", "https://*/*"] 
    }] 
} 

Popup:

<!doctype html> 
<html> 
    <head> 
    <title>Getting Started Extension's Popup</title> 
    <style> 
     body { 
     min-width: 357px; 
     overflow-x: hidden; 
     } 

     img { 
     margin: 5px; 
     border: 2px solid black; 
     vertical-align: middle; 
     width: 75px; 
     height: 75px; 
     } 
    </style> 
    <head> 
    <script src='jquery.min.js'></script> 
    <script src='popup.js'></script> 
</head> 
    </head> 
    <body> 
    </body> 
</html> 
+0

Ho modificato la tua domanda per una formattazione corretta e mi sono permesso di rimuovere la seconda domanda: è una domanda diversa, separali per favore. – Xan

+1

Il tuo problema risiede probabilmente nel tuo file 'popup.html', non c'è niente di sbagliato nel file JS. – Xan

+0

aggiunto il popup.html. Si prega di consulenza –

risposta

12

Ho ricevuto questo messaggio perché Chrome non consente più gli script inline e il gestore di eventi inline (come onClick): devono essere spostati in un file JS esterno (ad es. popup.js) e addEventListener() deve essere usato per associare eventi a oggetti DOM.

Ad esempio:

<body onload="initialize()"> 
<button onclick="handleClick()" id="button1"> 

deve essere sostituito da:

window.addEventListener("load", initialize); 
document.getElementById("button1").addEventListener("click",handleClick); 

Nel tuo caso, non vedo alcun JS nel codice HTML, ma ci sono alcune cose che si potrebbe provare :

  • move popup.js include subito prima del.
  • correggere l'html (doppia testa).
  • rimuovere la sezione content_scripts dal manifest. Gli script di contenuto dovrebbero essere eseguiti contro il contenuto della pagina, non sono il file JS incluso nella pagina o il popup di azione del browser. La sezione di azione del browser dovrebbe essere sufficiente.

Vedi Chrome extension manifest V2 notes

+2

Non rilevante per questo caso. Probabilmente sta usando una versione precedente di jQuery che ha problemi di CSP. – Xan

+0

Credo che Chrome li accetti ora. Non ho ancora capito come usare ancora. Dai un'occhiata qui: https://developer.chrome.com/extensions/contentSecurityPolicy#relaxing-inline-script – marcelocra

1

Ho avuto un problema molto simile. Non stavo usando nessuno script in linea o gestore eventi in linea, ma ottenevo ancora quell'errore. Venuto fuori, jQuery tenta internamente di valutare la risposta di tali richieste che non è consentita in Chrome Extensions. Nel mio caso, stavo usando $.ajax() con dataType: 'json'. Ho risolto il problema modificando dataType in text e quindi analizzando manualmente JSON utilizzando JSON.parse().

Inoltre, è importante ricordare che la maggior parte delle API di jQuery tenta di eseguire script inclusi in una determinata stringa html durante l'analisi che causa errori simili quando utilizzati in un'estensione di Chrome. In questi casi è richiesta la fuga esplicita di script nelle risposte. Ecco una citazione dalla documentazione jQuery parseHTML() s':

Most jQuery APIs that accept HTML strings will run scripts that are included in the HTML. jQuery.parseHTML does not run scripts in the parsed HTML unless keepScripts is explicitly true. However, it is still possible in most environments to execute scripts indirectly, for example via the attribute. The caller should be aware of this and guard against it by cleaning or escaping any untrusted inputs from sources such as the URL or cookies. For future compatibility, callers should not depend on the ability to run any script content when keepScripts is unspecified or false.

Si prega di notare che questi punti causare problemi quando viene utilizzato in un'estensione Chrome a causa di restrizioni di Chrome sulla valutazione script inline. Potrebbero non essere veri in generale.