为保护用户免受恶意 HTML 或 JavaScript 攻击,Apps 脚本使用 iframe 将 Google 文档、表格和表单的 HTML 服务 Web 应用或自定义界面沙盒化。(在其他情况下,HTML 服务不使用沙盒,例如生成电子邮件正文。)沙盒对客户端代码施加了限制。
沙盒模式
现在,除 IFRAME
之外的所有沙盒模式都已停用。现在,使用旧版沙盒模式的应用会自动使用新版 IFRAME
模式。如果您有使用旧模式(NATIVE
和 EMULATED
)开发的脚本,就应遵循迁移说明,以确保这些脚本在 IFRAME
模式下正常运行。
现在,setSandboxMode
方法在被调用时不会产生任何影响。
IFRAME 模式下的限制
IFRAME
沙盒模式基于 HTML5 中的 iframe 沙盒功能,具有以下关键字:
allow-same-origin
allow-forms
allow-scripts
allow-popups
allow-downloads
allow-modals
allow-popups-to-escape-sandbox
allow-top-navigation-by-user-activation
- 此属性仅适用于独立脚本项目。
allow-top-navigation
关键字允许内容浏览其顶级浏览上下文,但受到限制,并且未设置为沙盒中的属性。如果您需要重定向脚本,请改为添加链接或按钮,以便用户执行操作。
设置链接目标属性
在 IFRAME
模式下,您需要将链接目标属性设置为 _top
或 _blank
:
Code.js
function doGet() {
var template = HtmlService.createTemplateFromFile('top');
return template.evaluate().setSandboxMode(HtmlService.SandboxMode.IFRAME);
}
top.html
<!DOCTYPE html>
<html>
<body>
<div>
<a href="http://google.com" target="_top">Click Me!</a>
</div>
</body>
</html>
您还可以使用封闭网页的 head 部分中的 <base>
标记来替换此属性:
<!DOCTYPE html>
<html>
<head>
<base target="_top">
</head>
<body>
<div>
<a href="http://google.com">Click Me!</a>
</div>
</body>
</html>
必须为有效内容指定 HTTPS
“有效”内容(如脚本、外部样式表和 XmlHttpRequests)必须通过 HTTPS(而非 HTTP)加载。