Zum IFRAME Sandbox Mode migrieren

In Apps Script wird eine Sicherheits-Sandbox verwendet, um Anwendungen in bestimmten Situationen zu schützen. Alle Sandbox-Modi werden eingestellt, mit Ausnahme von IFRAME. Bei Apps, die ältere Sandbox-Modi verwenden, wird jetzt automatisch der neuere IFRAME-Modus verwendet.

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

  • Sie müssen jetzt das target-Attribut 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 native Ladebibliothek von Google api.js wird im Modus IFRAME nicht automatisch geladen
  • Picker-Nutzer müssen setOrigin() aufrufen, da Inhalte von einer neuen Domain ausgeliefert werden
  • Einige ältere Browser, einschließlich IE9, werden nicht unterstützt.
  • Importierte Ressourcen müssen jetzt HTTPS verwenden
  • Formulareinreichungen werden nicht mehr standardmäßig verhindert

Diese Unterschiede werden in den folgenden Abschnitten beschrieben.

Im IFRAME-Modus müssen Sie das Attribut „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-Abschnitt 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) werden bestimmten HTML-Tags automatisch einer .html-Datei von Apps Script hinzugefügt. Im Modus IFRAME geschieht das nicht.

Damit Ihre Projektseiten mit IFRAME korrekt ausgeliefert werden, müssen Sie den Seiteninhalt in die folgenden Top-Level-Tags einschließen:

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

Native JavaScript-Ladebibliothek muss explizit geladen werden

Scripts, die auf das automatische Laden der nativen Loader-Bibliothek api.js angewiesen waren, 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 an der Google Picker API

Wenn Sie die Google Picker API verwenden, müssen Sie beim Erstellen des PickerBuilders jetzt setOrigin() aufrufen und die Quelle 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ändiges funktionierendes Beispiel finden Sie unter Dialogfelder zum Öffnen von Dateien.

Unterstützte Browser

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

  • verwendet HtmlService und
  • zuvor EMULATED- oder NATIVE-Sandboxing verwendet haben

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

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

HTTPS ist jetzt für importierte Ressourcen erforderlich

Bisherige Anwendungen, die Ressourcen über HTTP importiert haben, müssen stattdessen auf HTTPS umgestellt werden.

Formulareinreichungen werden nicht mehr standardmäßig verhindert

Unter NATIVE wurde verhindert, dass HTML-Formulare in der Sandbox gesendet und die Seite aufgerufen werden. Daher kann ein Entwickler der Schaltfläche „Senden“ einfach einen onclick-Handler hinzufügen und sich keine Gedanken darüber machen, was danach passiert.

Im Modus IFRAME können jedoch HTML-Formulare gesendet werden. Wenn für ein Formularelement kein action-Attribut angegeben ist, wird es an eine leere Seite gesendet. Schlimmer noch: Der innere iframe wird auf die leere Seite weitergeleitet, bevor der onclick-Handler fertig ist.

Die Lösung besteht darin, Ihrer Seite JavaScript-Code hinzuzufügen, der verhindert, dass die Formularelemente tatsächlich gesendet werden, damit die Klick-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 HtmlService-Leitfaden Client-zu-Server-Kommunikation.