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 mittarget="_top"
odertarget="_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 ModusIFRAME
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.
Attribut „Link-Ziel“ festlegen
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
- oderNATIVE
-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.