29

Dies ist eine Chrome-Erweiterung. Ich versuche eine einfache, die die Google Chart API verwendetInhaltssicherheitsrichtlinie: Google API kann nicht in der Chrome-Erweiterung geladen werden

Ich habe diesen Code in meinem HTML-Dokument "popup.html", die auf den Klick auf das Symbol geladen wird.

<!doctype html> 
<html> 
<head> 
    <script type="text/javascript" src="js/libs/jquery-1.8.0.min.js"></script> 
    <script type="text/javascript" src="js/popup.js"></script> 
    <script type="text/javascript" src="http://www.google.com/jsapi?key=xxxxxxxxxxx"></script> 

    [...] 
</body> 
</html> 

bekomme ich folgende Meldung:

Refused, um das Skript zu laden 'http://www.google.com/jsapi?key=xxxxxxxxxxx', weil es die folgenden Content Security Policy Richtlinie verletzt : "script-src 'self' chrome-extension-resource:".

Ich verstand es etwas in Bezug auf Berechtigungen ist, habe ich versucht, meine Manifest-Datei zu ändern, aber ohne Erfolg:

{ 
    [...] 
    "manifest_version": 2, 
    "permissions": ["http://*.google.com/"], 
    "content_security_policy": "script-src 'self' http://www.google.com; object-src 'self'", 
} 

eine Idee?

+0

Verwenden Sie einen 'https:' Ressource. Http-Ressourcen können nie auf die weiße Liste gesetzt werden. –

Antwort

22

Verwenden Sie einfach das Protokoll https. Der Fehler, den Sie bekommen, bezieht sich auf die Content Security Policy.

Siehe den Relaxing the default policy Abschnitt der Seite. Es erwähnt, dass Sie nur HTTPS, chrome-extension und chrome-extension-resource auf die Whitelist setzen können.

+0

Dank @Amaan es macht es funktioniert ... Fast! Sollte ich eine andere Richtlinie haben? Auch wenn Google API geladen ist, kann ich es nicht starten. ' ' Abgelehnt, um Inline-Skript auszuführen, da es die folgende Inhaltssicherheitsrichtlinienrichtlinie verletzt:" script-src 'self' https://www.google.com ". – Laurent

+1

Nun, keine Inline-Skripte! Verwenden Sie stattdessen 'document.getElementById ('elementID'). AddEventListener 'für Ereignisse. Fügen Sie eine 'popup.js'-Datei für Ihre JS-Code-Blöcke hinzu. Siehe http://developer.chrome.com/trunk/contentSecurityPolicy.html#H3-1 –

28

Ich habe in den letzten 12 Stunden mit diesem Problem gerungen und es endlich zur Arbeit gebracht. Warum hat es so lange gedauert? Weil ich mehrmals von der Spur geworfen wurde. Erstens, die falschen führt:

  1. "machen es HTTPS" - spielt keine Rolle. Meine Chrome-Erweiterung führt nun reguläre HTTP-Aufrufe an eine andere Domäne durch und funktioniert einwandfrei. (UPDATE: Ein wenig mehr Klarstellung. Der Mythos "make it https" ist in einem ähnlichen Problem verwurzelt, das Leute haben, wenn es um das Laden von SCRIPT geht. Wenn Sie eine externe .js-Datei einbinden müssen, dann müssen Sie das tun Ändern Sie Ihre content_security_policy und fügen Sie den richtigen Hostnamen hinzu, der anscheinend nur https akzeptiert. Beachten Sie, dass dies anders ist, als einen externen Hostnamen für so etwas wie REST-Dienste zu treffen.Wie ich bereits sagte, erfordert dies keine Änderung von content_security_policy oder https.)

  2. "Verwenden Sie JSONP in Ihren JQuery AJAX-Aufrufen" - Dies ist möglicherweise eine Möglichkeit, domainübergreifendes AJAX in normalen Webseiten zu adressieren, ist jedoch aufgrund der integrierten Inhaltssicherheit nicht in einer Chrome-Erweiterung erforderlich Politik. Darüber hinaus klingt die Implementierung von JSONP wie eine PITA, da serverseitige Änderungen erforderlich sind, um den Callback-Parameter zu handhaben (oder so etwas, ich bin mir immer noch nicht sicher). Auf jeden Fall nicht notwendig.

  3. "Verwechseln Sie die CSP-Zeichenfolge (Content Security Policy) in Ihrer Erweiterung" - In der Manifestversion 2 funktioniert die Standardzeichenfolge "script-src 'self'; object-src 'self'". Sie müssen es nicht einmal explizit angeben. Was Sie brauchen, ist ein, die Domäne, die Sie versuchen, von der Erweiterung als "Erlaubnis" -Wert zu treffen.

Die Lösung:

Entfernen Sie alle Inline-Javascript aus Ihrer Erweiterung. Holen Sie es in eine separate .js-Datei. Ich vermute, dass für die meisten HTML-Dateien mit jeder anständigen Menge an Javascript, wird dieser Prozess saugen. Zum Glück für mich war alles, was ich hatte, ein Body-Onload, den ich stattdessen in eine separate js-Datei als window.addlistener onload-Ereignis verschieben konnte.

Die Seite, die Sie wirklich lesen müssen Vergangenheit dieses Problem zu bekommen, ist hier: https://developer.chrome.com/apps/contentSecurityPolicy

+0

Bitte zeigen Sie Codebeispiele, wie Sie diesen Fall beheben können, insbesondere in 'content_security_policy' in der Manifest-Datei. – Mohammad

Verwandte Themen