Apps 脚本使用安全沙盒
为 Google Workspace提供保护性隔离
特定情况下的应用全部
除 IFRAME
外,沙盒模式现已弃用。使用旧版沙盒的应用
模式现在自动使用较新的 IFRAME
模式。
以前将这些旧模式与 HTML Service 结合使用的应用可能需要
针对 IFRAME
模式进行更改,以解决以下差异:
- 现在,您必须使用
target="_top"
或target
target="_blank"
- HTML 服务提供的 HTML 文件必须包含 <!DOCTYPE html>、<html> 和 <body>标签
- Google 原生加载程序库
api.js
不会自动加载IFRAME
模式 - 用户需要致电的选择器
setOrigin()
,因为内容来自于新网域 - 某些旧版浏览器(包括 IE9)不受支持
- 导入的资源现在必须使用 HTTPS
- 默认情况下,系统不再阻止表单提交
以下各部分详细介绍了这些差异。
设置链接目标属性
在 IFRAME
模式下,您需要将链接目标属性设置为 _top
或 _blank
:
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>
您也可以使用 <base>头部内的标记 部分:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
顶级 HTML 标记
在 NATIVE
(和 EMULATED
)沙盒模式下,某些 HTML 标记将如下所示:
自动添加到 Apps 脚本 .html 文件中,但
使用 IFRAME
模式。
为确保使用 IFRAME
正确提供您的项目页面,请将
以下顶级标记中的网页内容:
<!DOCTYPE html>
<html>
<body>
<!-- Add your HTML content here -->
</body>
</html>
必须显式加载原生 JavaScript 加载器库
依赖于原生加载器库 api.js
自动加载的脚本
必须更改才能显式加载此库,如以下示例所示:
<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>
Google Picker API 更改
使用 Google Picker API 时,您现在必须在构建setOrigin()
PickerBuilder 并传入源 google.script.host.origin
,如下所示
如下例中所示:
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);
}
有关完整的有效示例,请参阅 文件打开对话框。
浏览器支持
IFRAME
沙盒模式基于
iframe 沙盒
功能
部分旧版浏览器(如 Internet Explorer 9)不支持此功能。这个
如果您的 Apps 脚本项目同时满足以下条件,则可能会出现问题:
- 使用
HtmlService
,以及 - 之前使用过的
EMULATED
或NATIVE
沙盒
如果将这些应用迁移到IFRAME
沙盒模式,它们可能无法再在
一些不支持 HTML5 的 iframe 的旧版浏览器(特别是 IE9 及更低版本)
沙盒功能
已请求 IFRAME
模式或根本不使用 HtmlService
的应用
则不受此问题影响
现在,导入的资源必须使用 HTTPS
之前使用 HTTP 导入资源的应用必须更改为 请改用 HTTPS。
默认情况下,系统不再阻止表单提交
在 NATIVE
下,系统会阻止实际提交沙盒 HTML 表单
以及浏览网页的情况因此,开发者只需添加一个 onclick
,
处理程序添加到提交按钮,而不必担心之后会发生什么。
在 IFRAME
模式下,但允许提交 HTML 表单,并且如果表单
元素未指定 action
属性,则该元素将提交到空白网页。
更糟糕的是,内部 iframe 会在 onclick
之前重定向到空白页面
处理程序将有机会完成。
解决方法是在网页上添加 JavaScript 代码,阻止表单生成 使点击处理程序有时间 函数:
<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>
可以在 htmlService 指南中找到完整示例 客户端到服务器的通信。