เมื่อแอปได้รับความนิยมมากขึ้น ก็อาจดึงดูดความสนใจที่ไม่พึงประสงค์จากผู้ใช้ที่เป็นอันตรายซึ่งอาจต้องการละเมิดแอปของคุณ หัวข้อนี้จะอธิบายคำแนะนำที่คุณควรใช้เพื่อช่วยป้องกันการโจมตีเหล่านี้ในการผสานรวมการเรียกเก็บเงินและลดผลกระทบของการละเมิดในแอป
ย้ายตรรกะที่มีความละเอียดอ่อนไปยังแบ็กเอนด์
ย้ายข้อมูลและตรรกะที่ละเอียดอ่อนไปยังเซิร์ฟเวอร์แบ็กเอนด์ ที่คุณควบคุมได้มากที่สุดเท่าที่การออกแบบแอปจะอนุญาต ยิ่งคุณมีข้อมูลและตรรกะในอุปกรณ์ส่วนหน้ามากเท่าใด อุปกรณ์ก็จะยิ่งเสี่ยงต่อการถูกแก้ไขหรือดัดแปลงมากขึ้นเท่านั้น
ตัวอย่างเช่น เกมหมากรุกออนไลน์ควรตรวจสอบความถูกต้องของการเดินหมากทั้งหมดในแบ็กเอนด์ แทนที่จะเชื่อว่าฟรอนต์เอนด์จะส่งการเดินหมากที่ถูกต้องตามกฎหมายเสมอ
นอกจากนี้ หากพบช่องโหว่หรือปัญหาด้านความปลอดภัย การแก้ไขข้อบกพร่อง แก้ไข และเปิดตัวการอัปเดตใน แบ็กเอนด์อาจง่ายกว่าในฟรอนต์เอนด์ ทั้งนี้ขึ้นอยู่กับการออกแบบระบบ
ยืนยันการซื้อก่อนให้สิทธิ์
กรณีพิเศษของข้อมูลที่ละเอียดอ่อนและตรรกะที่ควรจัดการในแบ็กเอนด์ คือการยืนยันและรับทราบการซื้อ หลังจากที่ผู้ใช้ทำการซื้อแล้ว คุณควรทำดังนี้
- ส่ง
purchaseToken
ที่เกี่ยวข้องไปยังแบ็กเอนด์ ซึ่งหมายความว่าคุณ ควรเก็บบันทึกค่าpurchaseToken
ทั้งหมดสำหรับการซื้อทั้งหมด - ตรวจสอบว่าค่า
purchaseToken
สำหรับการซื้อปัจจุบันไม่ตรงกับค่าpurchaseToken
ก่อนหน้าpurchaseToken
มีค่าที่ไม่ซ้ำกันทั่วโลก คุณจึงใช้ค่านี้เป็นคีย์หลักในฐานข้อมูลได้อย่างปลอดภัย - ใช้ปลายทาง
Purchases.products:get
หรือPurchases.subscriptionsv2:get
ใน Google Play Developer API เพื่อยืนยันกับ Google ว่า การซื้อนั้นถูกต้อง - หากการซื้อถูกต้องและไม่เคยใช้มาก่อน คุณจะให้สิทธิ์ในไอเทมหรือการสมัครใช้บริการในแอปได้อย่างปลอดภัย
- สำหรับการสมัครใช้บริการ เมื่อตั้งค่า
linkedPurchaseToken
ในPurchases.subscriptionsv2:get
คุณควรนำlinkedPurchaseToken
ออกจากฐานข้อมูลและเพิกถอนสิทธิ์ที่ มอบให้แก่linkedPurchaseToken
เพื่อให้มั่นใจว่าผู้ใช้หลายคนจะไม่ได้รับ สิทธิ์สำหรับการซื้อเดียวกัน - คุณควรให้สิทธิ์ก็ต่อเมื่อสถานะการซื้อเป็น
PURCHASED
และ ตรวจสอบว่าได้จัดการการซื้อPENDING
อย่างถูกต้อง หากมีการซื้อจำนวนมากCANCELED
คุณอาจให้สิทธิ์ในขณะที่การซื้อยังอยู่ในสถานะPENDING
ดูข้อมูลเพิ่มเติมได้ที่ การจัดการธุรกรรมที่รอดำเนินการ หลังจากให้สิทธิ์แล้ว หากต้องการใช้และตอบรับผลิตภัณฑ์ที่ใช้แล้วหมด ให้ใช้
Purchases.products:consume
Play Developer API ในเซิร์ฟเวอร์แบ็กเอนด์ที่ปลอดภัย หากต้องการรับทราบผลิตภัณฑ์ที่ใช้ครั้งเดียวหรือการสมัครใช้บริการ ให้เรียกใช้ปลายทาง Play Developer API ที่เกี่ยวข้อง ไม่ว่าจะเป็นPurchases.products:acknowledge
หรือPurchases.subscriptions:acknowledge
ในเซิร์ฟเวอร์แบ็กเอนด์ที่ปลอดภัย คุณต้องรับทราบเนื่องจากเป็นการแจ้งให้ Google Play ทราบว่าผู้ใช้ได้รับสิทธิ์ในการซื้อแล้ว คุณควรรับทราบการซื้อทันทีหลังจากให้สิทธิ์โปรดทราบว่าแม้ว่าคุณจะรับทราบหรือใช้การซื้อในฝั่งไคลเอ็นต์ผ่านแอปได้ แต่ API ฝั่งเซิร์ฟเวอร์จะให้การปกป้องเพิ่มเติมจากปัญหาต่างๆ เช่น การเชื่อมต่อเครือข่ายไม่ดีและกิจกรรมที่เป็นอันตราย ตัวอย่างเช่น ลองพิจารณาว่าหากผู้ใช้ซื้อสินค้าจากแอปของคุณ แต่ การเชื่อมต่อเครือข่ายขาดหายไปขณะที่ระบบกำลังตรวจสอบการซื้อ หากไม่มีการรับทราบจากเซิร์ฟเวอร์ ผู้ใช้อาจต้องเข้าสู่ระบบผ่านแอปอีกครั้งเพื่อ ดำเนินการรับทราบให้เสร็จสมบูรณ์ ไม่เช่นนั้น หากผู้ใช้ไม่กลับมาเข้าสู่ระบบภายใน 3 วัน ระบบจะคืนเงินสำหรับการซื้อโดยอัตโนมัติเนื่องจากไม่มีการรับทราบการซื้อ การรับทราบจากเซิร์ฟเวอร์จะป้องกันสถานการณ์นี้ โดยการส่งการรับทราบทันทีที่ Google Play แจ้งให้เซิร์ฟเวอร์ทราบว่าการซื้อนั้นถูกต้อง
ดูข้อมูลเพิ่มเติมเกี่ยวกับการรับทราบการซื้อและการใช้งานได้ที่ การประมวลผลการซื้อ
การปกป้องเนื้อหาที่คุณปลดล็อก
อย่ารวมเนื้อหาที่ปลดล็อกแล้วไว้ในไฟล์ APK เพื่อป้องกันไม่ให้ผู้ใช้ที่เป็นอันตรายเผยแพร่เนื้อหาดังกล่าวต่อ แต่ให้ทำอย่างใดอย่างหนึ่งต่อไปนี้แทน
- ใช้บริการแบบเรียลไทม์เพื่อส่งเนื้อหา เช่น ฟีดเนื้อหา การส่งเนื้อหาผ่านบริการแบบเรียลไทม์ยังช่วยให้คุณอัปเดตเนื้อหาอยู่เสมอได้ด้วย
- ใช้เซิร์ฟเวอร์ระยะไกลเพื่อส่งเนื้อหา
เมื่อส่งเนื้อหาจากเซิร์ฟเวอร์ระยะไกลหรือบริการแบบเรียลไทม์ คุณจะจัดเก็บเนื้อหาที่ปลดล็อกไว้ในหน่วยความจำของอุปกรณ์หรือจัดเก็บไว้ในการ์ด SD ของอุปกรณ์ได้ หากจัดเก็บเนื้อหาในการ์ด SD โปรดเข้ารหัสเนื้อหาและใช้คีย์การเข้ารหัสเฉพาะอุปกรณ์
ตรวจหาและจัดการการซื้อที่เป็นโมฆะ
การซื้อที่ถูกยกเลิกคือการซื้อที่ถูกยกเลิก เพิกถอน หรือ มีการปฏิเสธการชำระเงิน หากการซื้อที่ถูกยกเลิกได้ให้ไอเทมในแอปหรือเนื้อหาอื่นๆ แก่ผู้ใช้ก่อนหน้านี้ คุณสามารถใช้ Voided Purchases API เพื่อดูเหตุผลที่การซื้อถูกยกเลิกพร้อมกับเนื้อหาที่เกี่ยวข้องซึ่งคุณสามารถเรียกคืนได้
การซื้อไอเทมในแอปและการสมัครใช้บริการอาจถูกยกเลิกได้ด้วยเหตุผลหลายประการ ซึ่งรวมถึงเหตุผลต่อไปนี้
- การซื้อถูกยกเลิกโดยผู้ใช้ นักพัฒนาแอป หรือ Google (รวมถึงการซื้อที่ถูกยกเลิกอัตโนมัติที่ยังไม่ได้ตอบรับ) สำหรับการสมัครใช้บริการ โปรดทราบว่าการดำเนินการนี้หมายถึงการยกเลิกการซื้อการสมัครใช้บริการ ไม่ใช่การยกเลิกการสมัครใช้บริการเอง
- มีการดึงเงินคืนจากการซื้อ
- นักพัฒนาแอปยกเลิกหรือคืนเงินคำสั่งซื้อของผู้ใช้ และเลือกตัวเลือก "เพิกถอน" ในคอนโซล
คุณสามารถตัดสินใจเลือกแนวทางปฏิบัติได้โดยพิจารณาจากเหตุผลของการซื้อที่ถูกยกเลิกและนำข้อมูลพฤติกรรมของผู้ใช้ก่อนหน้านี้มาพิจารณา เราขอแนะนำให้ ใช้ข้อใดข้อหนึ่งหรือหลายข้อต่อไปนี้
- เรียกคืนไอเทม: เมื่อการซื้อเป็นโมฆะ คุณจะเรียกคืนไอเทมที่ยังไม่ได้ใช้ได้ ราวกับว่าไม่เคยมีการซื้อไอเทมเหล่านั้น เช่น หากการซื้อสกุลเงินในเกม เป็นโมฆะ คุณสามารถเรียกคืนสกุลเงินที่มอบให้ผู้ใช้ไปแล้ว ได้ ในกรณีที่ผู้ใช้ใช้สกุลเงินไปแล้ว ให้พิจารณาตั้งค่ายอดคงเหลือของสกุลเงินเป็นค่าลบ และจำกัดกิจกรรมในแอปและการซื้อในอนาคตจนกว่ายอดคงเหลือของสกุลเงินจะเป็นค่าบวก
- การใช้ระบบเตือนหลายครั้ง: พิจารณาใช้มาตรการที่รุนแรงน้อยลงสำหรับผู้กระทำผิดครั้งแรก เช่น แสดงคำเตือนในแอป สำหรับผู้กระทำผิดซ้ำ ให้พิจารณาใช้มาตรการที่รุนแรงขึ้น
- ปิดใช้การซื้อชั่วคราว: เช่นเดียวกับการใช้ระบบเตือนหลายครั้ง ให้พิจารณาปิดใช้การซื้อสำหรับผู้ใช้ที่มีการซื้อที่ถูกยกเลิก จนกว่าคุณจะตรวจสอบสาเหตุที่การซื้อถูกยกเลิกได้อย่างละเอียดมากขึ้น
- ไม่อนุญาตให้เข้าถึงแอปชั่วคราวหรือถาวร: ในกรณีที่ร้ายแรง ที่มีกิจกรรมที่เป็นอันตรายซ้ำๆ ให้พิจารณาไม่อนุญาตให้เข้าถึงแอป ชั่วคราวหรือถาวร
- เรียกใช้ Voided Purchases API บ่อยๆ: เมื่อตรวจพบการซื้อที่ถูกยกเลิกอย่างน้อย 1 รายการ ให้พิจารณาเรียกใช้ Voided Purchases API บ่อยขึ้นเพื่อเรียกคืนการซื้อก่อนที่ผู้ใช้จะใช้ไอเทมที่ซื้อ ดูข้อมูลเพิ่มเติมเกี่ยวกับโควต้า Voided Purchases API ได้ในเอกสารประกอบเกี่ยวกับ Voided Purchases API
ช่วย Google ตรวจหาการประพฤติมิชอบก่อนที่จะเกิดขึ้น
การประพฤติมิชอบบางประเภทเกี่ยวข้องกับผู้ใช้ที่เป็นอันตรายซึ่งสร้างบัญชี Google และบัญชีในแอปหลายบัญชีเพื่อซ่อนกิจกรรมของตน
ใช้วิธีการ
setObfuscatedAccountId
และ
setObfuscatedProfileId
ในเครื่องมือสร้างสำหรับ
BillingFlowParams
เพื่อช่วยให้ Google แมปบัญชี Google กับบัญชีในแอป
Google ใช้ข้อมูลนี้เพื่อตรวจหาพฤติกรรมที่น่าสงสัยและบล็อกธุรกรรมที่เป็นการประพฤติมิชอบบางประเภทก่อนที่จะดำเนินการเสร็จสมบูรณ์
การดำเนินการกับการละเมิดเครื่องหมายการค้าและลิขสิทธิ์
หากคุณใช้เซิร์ฟเวอร์ระยะไกลเพื่อส่งหรือจัดการเนื้อหา ให้แอปตรวจสอบสถานะการซื้อของเนื้อหาที่ปลดล็อกทุกครั้งที่ผู้ใช้เข้าถึงเนื้อหา ซึ่งจะช่วยให้คุณเพิกถอนการใช้งานได้เมื่อจำเป็นและลดการละเมิดลิขสิทธิ์ หากเห็นว่ามีการเผยแพร่เนื้อหาของคุณใน Google Play อีกครั้ง โปรดดำเนินการอย่างรวดเร็วและเด็ดขาด ดูรายละเอียดเพิ่มเติมได้ที่หน้าคำถามที่พบบ่อยเกี่ยวกับลิขสิทธิ์ ในศูนย์ช่วยเหลือด้านลิขสิทธิ์