ผู้ใช้จะไม่ติดตั้งส่วนขยายหากส่วนขยายถูกบุกรุกความเป็นส่วนตัวหรือขอสิทธิ์เพิ่มเติมตามที่เห็นว่าจำเป็น คำขอสิทธิ์ควรฟังดูสมเหตุสมผลสำหรับผู้ใช้และจำกัดอยู่เพียงข้อมูลสำคัญที่จำเป็นต่อการใช้งานส่วนขยายเท่านั้น ส่วนขยายที่รวบรวมหรือส่งข้อมูลผู้ใช้ต้องเป็นไปตามนโยบายภายใต้การปกป้องความเป็นส่วนตัวของผู้ใช้
ปกป้องและเคารพผู้ใช้ส่วนขยายโดยรวมข้อควรระวังเหล่านี้เพื่อรักษาความปลอดภัยให้กับข้อมูลประจำตัว
ลดสิทธิ์ที่จำเป็น
จะมีการระบุ 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/" ],
...
}
การรวมสิทธิ์ที่ไม่บังคับจะช่วยให้ส่วนขยายอธิบายเหตุผลที่ต้องใช้สิทธิ์บางอย่างได้เมื่อผู้ใช้เปิดใช้ฟีเจอร์ที่เกี่ยวข้อง ส่วนขยายจะมีตัวเลือกให้ผู้ใช้ เปิดใช้ฟีเจอร์ต่างๆ ได้
การคลิกตกลงจะทริกเกอร์เหตุการณ์ต่อไปนี้ในโปรแกรมทำงานของบริการ
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});
}
}