تستخدم "برمجة التطبيقات" وضع الحماية للأمان
لتوفير عزل وقائي عن Google Workspace
التطبيقات في مواقف معينة. الكل
تم إيقاف أوضاع وضع الحماية الآن باستثناء IFRAME
. التطبيقات التي تستخدم وضع حماية قديم
تستخدم الآن الأوضاع وضع IFRAME
الأحدث تلقائيًا.
قد تحتاج التطبيقات التي سبق لها استخدام هذه الأوضاع القديمة مع خدمة HTML إلى ما يلي:
عليك إجراء تغييرات على وضع IFRAME
لمعالجة الاختلافات التالية:
- وعليك الآن إلغاء سمة
target
للرابط باستخدام السمةtarget="_top"
.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 لبرمجة التطبيقات، ولكن لا يحدث ذلك عندما
باستخدام وضع 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، يجب عليك الآن استدعاء setOrigin()
عند إنشاء
المنتقي والممر في المصدر 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
الجديدة في HTML5.
وهذا الإجراء غير متاح في بعض المتصفّحات القديمة، مثل Internet Explorer 9. هذا النمط
مشكلة إذا كان مشروع "برمجة تطبيقات Google" يعمل على النحو التالي:
- يستخدم
HtmlService
، - سبق أن تم استخدام وضع الحماية
EMULATED
أوNATIVE
يعني نقل بيانات هذه التطبيقات إلى وضع الحماية في IFRAME
أنّها قد لا تعمل بعد الآن.
بعض المتصفحات القديمة (خصوصًا IE9 والإصدارات الأقدم) التي لا تتوافق مع إطار iframe في HTML5
وضع الحماية.
التطبيقات التي تطلب وضع 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. الاتصال من عميل إلى خادم: