Zum IFRAME Sandbox Mode migrieren

Apps Script verwendet eine Sicherheits-Sandbox, um Google Workspace-Anwendungen in bestimmten Situationen zu schützen. Alle Sandbox-Modi mit Ausnahme von IFRAME werden jetzt eingestellt. Apps, die ältere Sandbox-Modi verwenden, nutzen jetzt automatisch den neueren Modus IFRAME.

Bei Apps, die diese älteren Modi zuvor mit dem HTML-Dienst verwendet haben, sind möglicherweise Änderungen für den IFRAME-Modus erforderlich, um die folgenden Unterschiede zu berücksichtigen:

  • Sie müssen jetzt das Attribut target des Links mit target="_top" oder target="_blank" überschreiben.
  • HTML-Dateien, die vom HTML-Dienst bereitgestellt werden, müssen die Tags <!DOCTYPE html>, <html> und <body> enthalten.
  • Die Google-eigene Loader-Bibliothek api.js wird im Modus IFRAME nicht automatisch geladen.
  • Picker-Nutzer müssen setOrigin() aufrufen, da Inhalte über eine neue Domain bereitgestellt werden.
  • Einige ältere Browser, darunter IE9, werden nicht unterstützt.
  • Importierte Ressourcen müssen jetzt HTTPS verwenden
  • Formularübermittlungen werden nicht mehr standardmäßig verhindert

Diese Unterschiede werden in den folgenden Abschnitten beschrieben.

Im IFRAME-Modus müssen Sie das Attribut für das Linkziel auf _top oder _blank festlegen:

Code.js

function doGet() {
  var template = HtmlService.createTemplateFromFile('top');
  return template.evaluate();
}

top.html

<!DOCTYPE html>
<html>
 <body>
   <div>
     <a href="http://google.com" target="_top">Click Me!</a>
   </div>
 </body>
</html>

Sie können dieses Attribut auch mit dem <base>-Tag im head-Bereich der umschließenden Webseite überschreiben:

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
   <div>
     <a href="http://google.com">Click Me!</a>
   </div>
 </body>
</html>

HTML-Tags der obersten Ebene

Im Sandbox-Modus NATIVE (und EMULATED) wurden bestimmte HTML-Tags automatisch einer Apps Script-Datei mit der Endung .html hinzugefügt. Das ist im Modus IFRAME nicht der Fall.

Damit Ihre Projektseiten mit IFRAME richtig ausgeliefert werden, müssen Sie den Seiteninhalt in die folgenden Tags der obersten Ebene einfügen:

<!DOCTYPE html>
<html>
  <body>
    <!-- Add your HTML content here -->
  </body>
</html>

Die native JavaScript-Loader-Bibliothek muss explizit geladen werden.

Skripts, die auf dem automatischen Laden der nativen Loader-Bibliothek api.js basierten, müssen so geändert werden, dass diese Bibliothek explizit geladen wird, wie im folgenden Beispiel:

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

Änderung der Google Picker API

Wenn Sie die Google Picker API verwenden, müssen Sie jetzt setOrigin() aufrufen, wenn Sie den PickerBuilder erstellen, und den Ursprung google.script.host.origin übergeben, wie im folgenden Beispiel gezeigt:

function createPicker(oauthToken) {
  var picker = new google.picker.PickerBuilder()
      .addView(google.picker.ViewId.SPREADSHEETS) // Or a different ViewId
      .setOAuthToken(oauthToken)
      .setDeveloperKey(developerKey)
      .setCallback(pickerCallback)
      .setOrigin(google.script.host.origin) // Note the setOrigin
      .build();
  picker.setVisible(true);
}

Ein vollständig funktionierendes Beispiel finden Sie unter Dialogfelder zum Öffnen von Dateien.

Unterstützte Browser

Der IFRAME-Sandbox-Modus basiert auf der HTML5-Funktion iFrame-Sandboxing. In einigen älteren Browsern wie Internet Explorer 9 wird dies nicht unterstützt. Das kann ein Problem sein, wenn Ihr Apps Script-Projekt folgende Bedingungen erfüllt:

  • HtmlService verwendet und
  • zuvor verwendete EMULATED- oder NATIVE-Sandbox

Wenn diese Apps in den IFRAME-Sandbox-Modus migriert werden, funktionieren sie möglicherweise nicht mehr in einigen älteren Browsern (insbesondere IE9 und früher), die die iframe-Sandbox-Funktion von HTML5 nicht unterstützen.

Apps, die bereits den IFRAME-Modus anfordern oder HtmlService überhaupt nicht verwenden, sind von diesem Problem nicht betroffen.

HTTPS ist jetzt für importierte Ressourcen erforderlich

Bei früheren Anwendungen, in denen Ressourcen über HTTP importiert wurden, muss HTTPS verwendet werden.

Formularübermittlungen werden nicht mehr standardmäßig verhindert

Im NATIVE-Sandbox-Modus wurde verhindert, dass HTML-Formulare tatsächlich gesendet und die Seite aufgerufen werden konnte. Ein Entwickler könnte also einfach einen onclick-Handler für die Schaltfläche „Senden“ hinzufügen und sich keine Gedanken darüber machen müssen, was danach passiert.

Im IFRAME-Modus dürfen HTML-Formulare jedoch gesendet werden. Wenn für ein Formularelement kein action-Attribut angegeben ist, wird es an eine leere Seite gesendet. Schlimmer noch: Das innere iFrame wird zur leeren Seite weitergeleitet, bevor der onclick-Handler abgeschlossen ist.

Die Lösung besteht darin, Ihrer Seite JavaScript-Code hinzuzufügen, der verhindert, dass die Formularelemente tatsächlich gesendet werden, damit die Click-Handler Zeit haben, zu funktionieren:

<script>
  // Prevent forms from submitting.
  function preventFormSubmit() {
    var forms = document.querySelectorAll('form');
    for (var i = 0; i < forms.length; i++) {
      forms[i].addEventListener('submit', function(event) {
        event.preventDefault();
      });
    }
  }
  window.addEventListener('load', preventFormSubmit);
</script>

Ein vollständiges Beispiel finden Sie im Leitfaden zu HtmlService unter Client-to-Server Communication (Client-Server-Kommunikation).