انتقال به حالت جعبه ایمنی IFRAME (original) (raw)

Apps Script از یک جعبه ایمنی امنیتی برای ارائه ایزوله محافظ استفاده می کند Google Workspaceبرنامه های کاربردی در شرایط خاص همه حالت‌های جعبه ایمنی به جز IFRAME اکنون غروب هستند. برنامه‌هایی که از حالت‌های جعبه ایمنی قدیمی‌تر استفاده می‌کنند، اکنون از حالت جدیدتر IFRAME به‌طور خودکار استفاده می‌کنند.

برنامه‌هایی که قبلاً از این حالت‌های قدیمی‌تر با سرویس HTML استفاده می‌کردند، ممکن است برای رفع تفاوت‌های زیر نیاز به تغییر در حالت IFRAME داشته باشند:

این تفاوت ها در بخش های بعدی به تفصیل بیان می شوند.

تنظیم ویژگی هدف پیوند

در حالت 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>

همچنین می‌توانید این ویژگی را با استفاده از تگ در قسمت head صفحه وب دربرگیرنده لغو کنید:

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

در حالت NATIVEEMULATED )، برچسب‌های HTML خاصی به‌طور خودکار به فایل html. Apps Script اضافه می‌شوند، اما در هنگام استفاده از حالت IFRAME این اتفاق نمی‌افتد.

برای اطمینان از اینکه صفحات پروژه شما با استفاده از IFRAME به درستی ارائه می شوند، محتوای صفحه خود را در برچسب های سطح بالای زیر قرار دهید:

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

کتابخانه بارگذار جاوا اسکریپت بومی باید به صراحت بارگیری شود

اسکریپت هایی که به بارگیری خودکار کتابخانه بارکننده بومی api.js متکی هستند، باید تغییر کنند تا این کتابخانه به طور صریح بارگیری شود، مانند مثال زیر:

<script src="https://apis.google.com/js/api.js?onload=onApiLoad">
</script>

تغییر API Google Picker

هنگام استفاده از 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 بر اساس ویژگی sandboxing iframe در HTML5 است. این در برخی از مرورگرهای قدیمی‌تر مانند اینترنت اکسپلورر 9 پشتیبانی نمی‌شود. اگر Apps Script شما هر دو را پروژه می‌کند، ممکن است مشکل ایجاد شود:

انتقال این برنامه‌ها به حالت جعبه ایمنی IFRAME به این معنی است که ممکن است دیگر در برخی از مرورگرهای قدیمی (به ویژه IE9 و نسخه‌های قبلی) که از ویژگی sandboxing iframe HTML5 پشتیبانی نمی‌کنند، کار نکنند.

برنامه‌هایی که قبلاً حالت IFRAME درخواست کرده‌اند یا اصلاً از HtmlService استفاده نمی‌کنند تحت تأثیر این مشکل قرار نمی‌گیرند.

HTTPS اکنون برای منابع وارد شده مورد نیاز است

برنامه‌های قبلی که منابع را با استفاده از HTTP وارد می‌کردند باید برای استفاده از HTTPS تغییر کنند.

دیگر به طور پیش فرض از ارسال فرم جلوگیری نمی شود

تحت سندباکس NATIVE ، فرم‌های HTML از ارسال و پیمایش واقعی صفحه جلوگیری می‌شدند. با توجه به آن، یک توسعه‌دهنده می‌تواند به سادگی یک کنترل کننده onclick را به دکمه ارسال اضافه کند و نگران اتفاقات بعدی نباشد.

با این حال، با حالت IFRAME ، فرم‌های HTML مجاز به ارسال هستند، و اگر عنصر فرم هیچ ویژگی action مشخصی نداشته باشد، به یک صفحه خالی ارسال می‌شود. بدتر از آن، iframe داخلی قبل از اینکه کنترل کننده onclick فرصتی برای اتمام داشته باشد به صفحه خالی هدایت می شود.

راه حل این است که کد جاوا اسکریپت را به صفحه خود اضافه کنید که از ارسال واقعی عناصر فرم جلوگیری می کند، به طوری که کنترل کننده های کلیک زمان لازم برای عملکرد را داشته باشند:

<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 ارتباط مشتری به سرور پیدا کرد.