لن يثبّت المستخدمون إضافة إذا كانت تعرّض خصوصيتهم للخطر أو تطلب أذونات أكثر مما يبدو أنّها تحتاجه. يجب أن تكون طلبات الأذونات منطقية للمستخدمين وأن تكون محصورة في المعلومات المهمة اللازمة لتنفيذ الإضافة. يجب أن تمتثل الإضافات التي تجمع أي بيانات للمستخدمين أو تنقلها للسياسات الواردة ضمن حماية خصوصية المستخدم.
يمكنك حماية مستخدمي الإضافة واحترام خصوصيتهم من خلال اتّخاذ هذه الاحتياطات للحفاظ على أمان هويتهم.
تقليل الأذونات المطلوبة
يتم تحديد واجهات برمجة التطبيقات التي يمكن للإضافة الوصول إليها في الحقل permissions من البيان. كلما زاد عدد الأذونات الممنوحة، زادت الطرق التي يمكن للمهاجم من خلالها اعتراض المعلومات. يجب إدراج واجهات برمجة التطبيقات التي يعتمد عليها الامتداد فقط، ويجب مراعاة الخيارات الأقل تدخلاً. كلّما قلّت الأذونات التي يطلبها أحد الإضافات، قلّت تحذيرات الأذونات التي ستظهر للمستخدم. من المرجّح أن يثبّت المستخدمون إضافة تتضمّن تحذيرات محدودة.
يجب ألا تحاول الإضافات "استباق الأمور" من خلال طلب أذونات لا تحتاج إليها حاليًا، ولكن قد تستخدمها في المستقبل. ضمِّن الأذونات الجديدة في تحديثات الإضافة واجعلها اختيارية.
activeTab
يمكن غالبًا استبدال activeTab بالإضافات التي تستخدم أذونات المضيف لإدخال البرامج النصية. سيمنح الإذن activeTab الإضافة إذنًا مؤقتًا بالوصول إلى علامة التبويب النشطة حاليًا، وذلك فقط عندما يستدعي المستخدم الإضافة. ويتم قطع الاتصال عندما يخرج المستخدم من علامة التبويب الحالية أو يغلقها. وهي بديل للعديد من استخدامات <all_urls>.
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": ["activeTab"],
"manifest_version": 3
}
لا يعرض إذن activeTab أي رسائل تحذير أثناء التثبيت.
اختيار الأذونات الاختيارية
يمكنك منح المستخدمين القدرة على اختيار الميزات والأذونات التي يحتاجون إليها من إحدى الإضافات من خلال تضمين أذونات اختيارية. إذا لم تكن الميزة ضرورية للوظيفة الأساسية للإضافة، اجعلها اختيارية وانقل واجهة برمجة التطبيقات أو النطاق إلى الحقل optional_permissions.
{
"name": "Very Secure Extension",
...
"optional_permissions": [ "tabs", ],
"optional_host_permissions": ["https://www.google.com/" ],
...
}
يتيح تضمين أذونات اختيارية لإحدى الإضافات توضيح سبب حاجتها إلى إذن معيّن عندما يفعّل المستخدم الميزة ذات الصلة. يمكن أن توفّر الإضافة للمستخدم خيارًا لتفعيل الميزات.

سيؤدي النقر على حسنًا إلى تشغيل الحدث التالي في عامل الخدمة.
chrome.action.onClicked.addListener((event) => {
// Permissions must be requested from inside a user gesture, like a button's
// click handler.
chrome.permissions.request(
{
permissions: ["tabs", "scripting"],
origins: ['https://www.google.com/']
},
function (granted) {
// The callback argument will be true if the user granted the permissions.
if (granted) {
// doSomething();
} else {
// doSomethingElse();
}
}
);
});
سيظهر للمستخدم بعد ذلك الطلب التالي.

يمكن أيضًا تنفيذ الأذونات الاختيارية في تحديث للإضافة. سيؤدي ذلك إلى إتاحة الميزة الجديدة للمستخدمين بدون إيقاف الإضافة، كما قد يحدث عند التحديث باستخدام أذونات جديدة مطلوبة.
الحدّ من معلومات المستخدمين وتأمينها
لا تطلب سوى الحدّ الأدنى من البيانات التي تحتاج إليها الإضافة. كلّما قلّت المعلومات التي تطلبها الإضافة من المستخدم، قلّت المخاطر في حال تعرّض الإضافة للاختراق.
يجب التعامل بعناية مع جميع بيانات المستخدمين المطلوبة. تخزين البيانات واستردادها في خادم آمن باستخدام نطاق مسجّل استخدِم بروتوكول HTTPS دائمًا للاتصال وتجنَّب الاحتفاظ ببيانات المستخدمين الحسّاسة في جهة العميل من الإضافة لأنّ مساحة تخزين الإضافة غير مشفّرة.
حفظ البيانات ووضع التصفّح المتخفي
يمكن للإضافات حفظ البيانات باستخدام واجهة برمجة التطبيقات storage أو عن طريق إرسال طلبات إلى الخادم تؤدي إلى حفظ البيانات. عندما تحتاج الإضافة إلى حفظ شيء ما، يجب أولاً التحقّق مما إذا كان المحتوى من نافذة تصفّح متخفي. لا يتم تشغيل الإضافات تلقائيًا في نوافذ التصفّح المتخفي.
يضمن وضع التصفّح المتخفي عدم ترك النافذة أي آثار. وعند التعامل مع بيانات من نوافذ التصفّح المتخفي، يجب أن تلتزم الإضافات بهذا الوعد. إذا كان أحد الإضافات يحفظ عادةً سجلّ التصفّح، لا تحفظ السجلّ من نوافذ التصفّح المتخفي. ومع ذلك، يمكن للإضافات تخزين إعدادات مفضّلة من أي نافذة، سواء كانت نافذة تصفّح متخفٍ أو لا.
للتأكّد مما إذا كانت إحدى النوافذ في وضع التصفّح المتخفي، تحقّق من السمة incognito للكائن tabs.Tab أو windows.Window ذي الصلة.
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}