سرویس HTML: محدودیت ها

برای محافظت از کاربران در برابر دریافت HTML یا جاوا اسکریپت مخرب، Apps Script از iframeها برای sandbox کردن برنامه‌های وب سرویس HTML یا رابط‌های کاربری سفارشی برای Google Docs، Sheets و Forms استفاده می‌کند. (سرویس HTML در موقعیت‌های دیگر، مانند تولید بدنه یک ایمیل، از sandbox استفاده نمی‌کند.) sandbox محدودیت‌هایی را بر کد سمت کلاینت اعمال می‌کند.

حالت سندباکس

همه حالت‌های سندباکس اکنون به جز IFRAME غیرفعال شده‌اند. برنامه‌هایی که از حالت‌های قدیمی‌تر سندباکس استفاده می‌کنند، اکنون به طور خودکار از حالت جدیدتر IFRAME استفاده می‌کنند. اگر اسکریپت‌هایی دارید که با استفاده از حالت‌های قدیمی‌تر ( NATIVE و EMULATED ) توسعه داده شده‌اند، باید دستورالعمل‌های مهاجرت را دنبال کنید تا مطمئن شوید که آنها به درستی در حالت IFRAME کار می‌کنند.

متد setSandboxMode اکنون هنگام فراخوانی هیچ تاثیری ندارد.

محدودیت‌ها در حالت IFRAME

حالت سندباکس IFRAME بر اساس ویژگی سندباکس iframe در HTML5 است و از کلمات کلیدی زیر استفاده می‌کند:

  • 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 که به محتوا اجازه می‌دهد در بالاترین سطح خود پیمایش کند، محدود شده و به عنوان یک ویژگی در sandbox تنظیم نشده است. اگر نیاز به تغییر مسیر اسکریپت خود دارید، به جای آن یک لینک یا دکمه برای کاربر اضافه کنید تا اقدامی انجام دهد.

در حالت IFRAME باید ویژگی هدف لینک را روی _top یا _blank تنظیم کنید:

کد.js

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

بالا.html

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

همچنین می‌توانید این ویژگی را با استفاده از تگ <base> در بخش head صفحه وب مربوطه، بازنویسی کنید:

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

HTTPS برای محتوای فعال مورد نیاز است

محتوای «فعال» مانند اسکریپت‌ها، استایل‌شیت‌های خارجی و درخواست‌های XmlHttp باید از طریق HTTPS بارگذاری شوند، نه HTTP.