ผู้ใช้จะไม่ติดตั้งส่วนขยายหากส่วนขยายนั้นละเมิดความเป็นส่วนตัวหรือขอสิทธิ์มากกว่าที่จำเป็น คำขอสิทธิ์ควรฟังดูสมเหตุสมผลสำหรับผู้ใช้และจำกัดไว้สำหรับข้อมูลสำคัญที่จำเป็นต่อการติดตั้งใช้งานส่วนขยาย ส่วนขยายที่รวบรวมหรือส่งข้อมูลผู้ใช้ต้องเป็นไปตามนโยบายในส่วนการปกป้องความเป็นส่วนตัวของผู้ใช้
ปกป้องและเคารพผู้ใช้ส่วนขยายโดยใช้ข้อควรระวังเหล่านี้เพื่อรักษาข้อมูลประจำตัวของผู้ใช้ให้ปลอดภัย
ลดสิทธิ์ที่จำเป็น
API ที่ส่วนขยายเข้าถึงได้จะระบุไว้ในpermissionsของไฟล์ Manifest ยิ่งให้สิทธิ์มากเท่าใด ผู้โจมตีก็ยิ่งมีช่องทางในการดักข้อมูลมากขึ้นเท่านั้น ควรแสดงเฉพาะ API ที่ส่วนขยายใช้ และควรพิจารณาตัวเลือกที่รุกล้ำน้อยกว่า ยิ่งส่วนขยายขอสิทธิ์น้อยเท่าใด คำเตือนเกี่ยวกับสิทธิ์ก็จะแสดงต่อผู้ใช้น้อยลงเท่านั้น ผู้ใช้มีแนวโน้มที่จะติดตั้งส่วนขยายที่มีคำเตือนจำกัดมากกว่า
ส่วนขยายไม่ควร "เตรียมพร้อมสำหรับอนาคต" ในการเข้าถึงข้อมูลผู้ใช้ด้วยการขอสิทธิ์ที่ปัจจุบันไม่จำเป็น แต่จะนำไปใช้ในอนาคต รวมสิทธิ์ใหม่ไว้ในการอัปเดตส่วนขยาย และพิจารณาทำให้สิทธิ์เหล่านั้นไม่บังคับ
activeTab
ส่วนขยายที่ใช้สิทธิ์ของโฮสต์เพื่อแทรกสคริปต์มักจะใช้ activeTab แทนได้ activeTabสิทธิ์จะให้สิทธิ์เข้าถึงแท็บที่ใช้งานอยู่ในปัจจุบันแก่ส่วนขยายเป็นการชั่วคราวเฉพาะเมื่อผู้ใช้เรียกใช้ส่วนขยายเท่านั้น ระบบจะตัดสิทธิ์การเข้าถึงเมื่อผู้ใช้ออกจากแท็บปัจจุบันหรือปิดแท็บ โดยเป็นทางเลือกสำหรับการใช้งาน <all_urls> หลายอย่าง
{
"name": "Very Secure Extension",
"version": "1.0",
"description": "Example of a Secure Extension",
"permissions": ["activeTab"],
"manifest_version": 3
}
สิทธิ์ activeTab จะไม่แสดงข้อความเตือนระหว่างการติดตั้ง
เลือกใช้สิทธิ์ที่ไม่บังคับ
ช่วยให้ผู้ใช้เลือกได้ว่าจะต้องการฟีเจอร์และสิทธิ์ใดจากส่วนขยายโดยการระบุสิทธิ์ที่ไม่บังคับ หากฟีเจอร์ไม่จำเป็นต่อฟังก์ชันหลักของส่วนขยาย ให้ทําให้เป็นฟีเจอร์ที่ไม่บังคับ แล้วย้าย API หรือโดเมนไปยังช่อง optional_permissions
{
"name": "Very Secure Extension",
...
"optional_permissions": [ "tabs", ],
"optional_host_permissions": ["https://www.google.com/" ],
...
}
การรวมสิทธิ์ที่ไม่บังคับจะช่วยให้ส่วนขยายอธิบายได้ว่าทำไมจึงต้องมีสิทธิ์เฉพาะ เมื่อผู้ใช้เปิดใช้ฟีเจอร์ที่เกี่ยวข้อง ส่วนขยายสามารถเสนอตัวเลือกให้ผู้ใช้เปิดใช้ ฟีเจอร์ได้

การคลิกตกลงจะทริกเกอร์เหตุการณ์ต่อไปนี้ใน Service Worker
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 API หรือโดยการส่งคำขอไปยังเซิร์ฟเวอร์ซึ่ง ส่งผลให้มีการบันทึกข้อมูล เมื่อส่วนขยายต้องบันทึกสิ่งใดก็ตาม ให้พิจารณาก่อนว่ามาจาก หน้าต่างโหมดไม่ระบุตัวตนหรือไม่ โดยค่าเริ่มต้น ส่วนขยายจะไม่ทำงานในหน้าต่างที่ไม่ระบุตัวตน
โหมดไม่ระบุตัวตนรับประกันว่าหน้าต่างจะไม่ทิ้งร่องรอยใดๆ ไว้ เมื่อจัดการข้อมูลจากหน้าต่างโหมดไม่ระบุตัวตน ส่วนขยายควรปฏิบัติตามสัญญาข้อนี้ หากปกติแล้วส่วนขยายจะบันทึกประวัติการท่องเว็บ ให้งดบันทึกประวัติจากหน้าต่างที่ไม่ระบุตัวตน อย่างไรก็ตาม ส่วนขยายสามารถจัดเก็บค่ากำหนดการตั้งค่าจากหน้าต่างใดก็ได้ ไม่ว่าจะเป็นหน้าต่างที่ไม่ระบุตัวตนหรือไม่ก็ตาม
หากต้องการตรวจหาว่าหน้าต่างอยู่ในโหมดไม่ระบุตัวตนหรือไม่ ให้ตรวจสอบพร็อพเพอร์ตี้ incognito ของออบเจ็กต์ tabs.Tab หรือ windows.Window ที่เกี่ยวข้อง
function saveTabData(tab) {
if (tab.incognito) {
return;
} else {
chrome.storage.local.set({data: tab.url});
}
}