Externer Inhalt

Das Sicherheitsmodell für Chrome-Apps verbietet externe Inhalte in iFrames sowie die Verwendung von Inline-Inhalten. Scripting und eval(). Sie können diese Einschränkungen überschreiben, aber Ihre externen Inhalte müssen von der App isoliert.

Isolierte Inhalte können nicht direkt auf die Daten der App oder eine der APIs zugreifen. Ursprungsübergreifend verwenden XMLHttpRequests und Post-Nachrichten zur Kommunikation zwischen der Veranstaltungsseite und den in der Sandbox durchgeführten Inhalten. indirekt auf die APIs zugreifen.

Auf externe Ressourcen verweisen

Laut der Content Security Policy von Apps sind viele Arten von Remote-URLs nicht zulässig. Auf externe Bilder, Stylesheets oder Schriftarten einer App-Seite kann nicht direkt verwiesen werden. Stattdessen können Sie Verwenden Sie ursprungsübergreifende XMLHttpRequests, um diese Ressourcen abzurufen und stellen Sie sie dann über blob:-URLs bereit.

Manifestanforderung

Um ursprungsübergreifende XMLHttpRequests ausführen zu können, musst du eine Berechtigung für die Host:

"permissions": [
    "...",
    "https://supersweetdomainbutnotcspfriendly.com/"
  ]

Ursprungsübergreifende XMLHttpRequest

Rufen Sie die Remote-URL in der Anwendung ab und stellen Sie deren Inhalt als blob:-URL bereit:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://supersweetdomainbutnotcspfriendly.com/image.png', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
  var img = document.createElement('img');
  img.src = window.URL.createObjectURL(this.response);
  document.body.appendChild(img);
};

xhr.send();

Es empfiehlt sich, diese Ressourcen lokal zu speichern, damit sie offline verfügbar sind.

Externe Webseiten einbetten

Mit dem Tag webview können Sie externe Webinhalte in Ihre App einbetten, etwa eine Website Seite. Sie ersetzt iFrames, die auf Remote-URLs verweisen, die in Chrome-Apps deaktiviert sind. „Mag ich“-Bewertung entfernen iFrames verwenden, wird das webview-Tag in einem separaten Prozess ausgeführt. Das bedeutet, dass ein Exploit immer noch isoliert sein und können keine erhöhten Berechtigungen erlangen. Da die Speicherkapazität (Cookies usw.) von der App isoliert ist, gibt es keine Möglichkeit für den Webinhalt, auf die App-Daten.

WebView-Element hinzufügen

Das webview-Element muss die URL zum Quellinhalt enthalten und seine Größe angeben.

<webview src="http://news.google.com/" width="640" height="480"></webview>

Attribute aktualisieren

Wenn du die Eigenschaften src, width und height eines webview-Tags dynamisch ändern möchtest, hast du folgende Möglichkeiten: Legen Sie diese Eigenschaften direkt im JavaScript-Objekt fest oder verwenden Sie die DOM-Funktion setAttribute.

document.querySelector('#mywebview').src =
    'http://blog.chromium.org/';
// or
document.querySelector('#mywebview').setAttribute(
    'src', 'http://blog.chromium.org/');

Lokale Sandbox-Inhalte

Durch Sandboxing können bestimmte Seiten an einem eindeutigen Sandbox-Ursprung bereitgestellt werden. Diese Seiten werden dann von ihrer Content Security Policy ausgenommen ist. In einer Sandbox ausgeführte Seiten können iFrames, Inline-Scripting und eval() Sehen Sie sich die Beschreibung des Manifestfelds für sandbox an.

Dies ist jedoch ein Kompromiss: In einer Sandbox ausgeführte Seiten können den Chrome-Browser nicht verwenden.* APIs Um beispielsweise eval(), geh wie hier beschrieben von der CSP aus, aber du kannst dann keine coolen neuen Funktionen nutzen.

Inline-Skripts in Sandbox verwenden

Hier ist ein Beispiel für eine Seite in einer Sandbox mit einem Inline-Skript und eval():

<html>
  <body>
    <h1>Woot</h1>
    <script>
      eval('console.log(\'I am an eval-ed inline script.\')');
    </script>
  </body>
</html>

Sandbox in Manifest einschließen

Du musst das Feld sandbox in das Manifest aufnehmen und die App-Seiten angeben, die in einem Sandbox:

"sandbox": {
  "pages": ["sandboxed.html"]
}

In einer Sandbox ausgeführte Seite in einem Fenster öffnen

Wie bei allen anderen App-Seiten können Sie ein Fenster erstellen, in dem die in einer Sandbox ausgeführte Seite geöffnet wird. Hier ist ein Beispiel, das zwei Fenster erstellt, eines für das nicht in einer Sandbox ausgeführte Hauptfenster der App und eines für das in einer Sandbox ausgeführte Seite:

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('window.html', {
    'bounds': {
      'width': 400,
      'height': 400,
      'left': 0,
      'top': 0
    }
  });

  chrome.app.window.create('sandboxed.html', {
    'bounds': {
      'width': 400,
      'height': 400,
      'left': 400,
      'top': 0
    }
  });
});

In einer Sandbox ausgeführte Seite in eine App-Seite einbetten

In einer Sandbox ausgeführte Seiten können auch mithilfe eines iframe in eine andere App-Seite eingebettet werden:

<!DOCTYPE html>
<html>
<head>
</head>
  <body>
    <p>I am normal app window.</p>

    <iframe src="sandboxed.html" width="300" height="200"></iframe>
  </body>
</html>

Nachrichten an Seiten senden, die in einer Sandbox ausgeführt werden

Das Senden einer Nachricht besteht aus zwei Teilen: Sie müssen eine Nachricht über die Seite bzw. das Fenster des Absenders posten, und auf Nachrichten auf der Empfängerseite bzw. im empfangenden Fenster warten.

Nachricht posten

Mithilfe von postMessage können Sie zwischen Ihrer App und Inhalten kommunizieren, die in einer Sandbox ausgeführt werden. Hier ein Beispiel Hintergrundskript, das eine Nachricht an die darin geöffnete Seite in einer Sandbox sendet:

var myWin = null;

chrome.app.runtime.onLaunched.addListener(function() {
  chrome.app.window.create('sandboxed.html', {
    'bounds': {
      'width': 400,
      'height': 400
    }
  }, function(win) {
       myWin = win;
       myWin.contentWindow.postMessage('Just wanted to say hey.', '*');
     });
});

Im Web möchten Sie in der Regel den genauen Ursprung angeben, von dem aus die Nachricht gesendet wird. Chrome-Apps haben keinen Zugriff auf den eindeutigen Ursprung von Inhalten in der Sandbox, sodass Sie nur alle auf die Zulassungsliste setzen können Ursprünge als akzeptable Ursprünge ('*'). Auf der Empfängerseite sollten Sie in der Regel den Ursprung überprüfen. Da Chrome-Apps-Inhalte enthalten sind, sind sie jedoch nicht erforderlich. Weitere Informationen finden Sie unter window.postMessage.

Nachrichten abhören und antworten

Hier sehen Sie einen Beispiel-Nachrichtenempfänger, der Ihrer in einer Sandbox ausgeführten Seite hinzugefügt wird:

var messageHandler = function(event) {
  console.log('Background script says hello.', event.data);

  // Send a reply
  event.source.postMessage(
      {'reply': 'Sandbox received: ' + event.data}, event.origin);
};

window.addEventListener('message', messageHandler);

Weitere Informationen finden Sie im Sandbox-Beispiel.