ต่อสู้กับการประพฤติมิชอบและการละเมิด

Google Play มุ่งมั่นที่จะรับประกันความปลอดภัยสำหรับทั้งผู้ใช้และนักพัฒนาแอป เราเข้าใจดีว่าการสร้างธุรกิจแอปที่ประสบความสำเร็จนั้นต้องอาศัยแพลตฟอร์มที่เชื่อถือได้ ซึ่งจะช่วยรักษาผลตอบแทนจากการลงทุนของคุณด้วยการป้องกันผู้ไม่ประสงค์ดีในเชิงรุก

เอกสารนี้อธิบายคำแนะนำในการป้องกันการโจมตีการผสานรวมการเรียกเก็บเงินและลดผลกระทบของการละเมิดในแอป

ปรับปรุงการป้องกัน

API และเครื่องมือต่อไปนี้สามารถลดความเสี่ยงในแอปได้

  • Voided Purchases API: เพิกถอนสิทธิ์เข้าถึงคำสั่งซื้อที่ถูกยกเลิก
  • Obfuscated Account ID: ช่วยตรวจหาเมื่อมีอุปกรณ์หลายเครื่องทำการ ซื้อในบัญชีเดียวกันภายในระยะเวลาสั้นๆ
  • การใช้งานแบ็กเอนด์: เครื่องมือต่างๆ เช่น Purchases.products:consume จะย้ายตรรกะทางธุรกิจไปยังแบ็กเอนด์ที่ปลอดภัย ซึ่งจะป้องกันการ ดัดแปลงฝั่งไคลเอ็นต์ นอกเหนือจากการใช้ API ของแพลตฟอร์มเหล่านี้แล้ว ให้ใช้แนวทางปฏิบัติแนะนำต่อไปนี้เพื่อรักษาความปลอดภัยของการผสานรวมเพิ่มเติมจากการเข้าถึงที่ไม่ได้รับอนุญาต

ป้องกันการปลอมแปลงตำแหน่ง

Google Play มีการป้องกันในตัวเพื่อป้องกันไม่ให้ผู้ไม่ประสงค์ดีใช้ตำแหน่งที่ไม่ถูกต้องเพื่อหาประโยชน์จากความแตกต่างของสกุลเงินในภูมิภาค (หรือที่เรียกว่าการปลอมแปลงตำแหน่ง) ละเมิดโปรโมชันและสิ่งจูงใจในการสมัครใช้บริการ และพยายามหลอกลวงบัตรของขวัญ

ย้ายตรรกะที่ละเอียดอ่อนไปยังแบ็กเอนด์

ย้ายข้อมูลและตรรกะที่ละเอียดอ่อนไปยังเซิร์ฟเวอร์แบ็กเอนด์ที่คุณควบคุมได้มากที่สุดเท่าที่การออกแบบแอปจะอนุญาต ยิ่งมีข้อมูลและตรรกะในอุปกรณ์ส่วนหน้ามากเท่าใด อุปกรณ์ก็จะยิ่งเสี่ยงต่อการถูกแก้ไขหรือดัดแปลงมากขึ้นเท่านั้น

ตัวอย่างเช่น เกมหมากรุกออนไลน์ควรตรวจสอบความถูกต้องของการเดินหมากทั้งหมดในแบ็กเอนด์แทนที่จะเชื่อว่าส่วนหน้าจะส่งการเดินหมากที่ถูกต้องตามกฎเสมอ

นอกจากนี้ หากพบช่องโหว่หรือปัญหาด้านความปลอดภัย การแก้ไขข้อบกพร่อง การแก้ไข และการติดตั้งใช้งานการอัปเดตในแบ็กเอนด์อาจทำได้ง่ายกว่าในส่วนหน้า ทั้งนี้ขึ้นอยู่กับการออกแบบระบบของคุณ

ยืนยันการซื้อก่อนให้สิทธิ์

กรณีพิเศษของข้อมูลและตรรกะที่ละเอียดอ่อนซึ่งควรจัดการในแบ็กเอนด์คือการยืนยันและการรับทราบการซื้อ หลังจากที่ผู้ใช้ทำการซื้อแล้ว คุณควรทำดังนี้

  • ส่ง purchaseToken ที่เกี่ยวข้องไปยังแบ็กเอนด์ ซึ่งหมายความว่าคุณควรเก็บรักษาบันทึกค่า purchaseToken ทั้งหมดสำหรับการซื้อทั้งหมด
  • ยืนยันว่าค่า purchaseToken สำหรับการซื้อปัจจุบันไม่ตรงกับค่า purchaseToken ก่อนหน้า purchaseToken เป็นค่าที่ไม่ซ้ำกันทั่วโลก ดังนั้นคุณจึงใช้ค่านี้เป็นคีย์หลักในฐานข้อมูลได้อย่างปลอดภัย
  • ใช้ปลายทาง Purchases.products:get หรือ Purchases.subscriptionsv2:get ใน Google Play Developer API เพื่อยืนยันกับ Google ว่าการซื้อนั้นถูกต้อง
  • หากเชื่อว่าการซื้อนั้นถูกต้อง ไม่เคยใช้หรือประมวลผลมาก่อน และผู้ใช้ผ่านการตรวจสอบสิทธิ์และตรวจสอบการประพฤติมิชอบทั้งหมด คุณก็ให้สิทธิ์การให้สิทธิ์เข้าถึงไอเทมที่ซื้อในแอปหรือการสมัครใช้บริการได้อย่างปลอดภัย
    • การตรวจสอบสิทธิ์และการละเมิด: ยืนยันว่าผู้ใช้ยังมีสิทธิ์ได้รับไอเทม หากคุณกำหนดค่าโฟลว์การเรียกเก็บเงินด้วย obfuscatedAccountId หรือ obfuscatedProfileId ให้ตรวจสอบว่า การแมปการซื้อตรงกับบัญชีผู้ใช้ที่คาดไว้ในระบบ ทำการตรวจสอบการละเมิด ความเสี่ยง หรือความปลอดภัยเพิ่มเติมตามที่แบ็กเอนด์กำหนด
    • การคืนเงินอย่างชัดแจ้งสำหรับการซื้อที่ไม่ถูกต้อง: หากการซื้อไม่ผ่านการตรวจสอบความถูกต้องหรือการตรวจสอบการละเมิด อย่าให้สิทธิ์ แทนที่จะ ปล่อยให้การซื้อคืนเงินอัตโนมัติเนื่องจากไม่มีการรับทราบ (ซึ่ง ไม่ชัดเจนเนื่องจากอาจเกิดจากไทม์เอาต์ในการประมวลผลด้วย) ให้คืนเงินสำหรับการซื้ออย่างชัดแจ้งโดยใช้ ปลายทาง Orders:refund (หรือ Play Developer API ที่คล้ายกัน) โดยตั้งค่าพารามิเตอร์ revoke เป็น true การตั้งค่าพารามิเตอร์ revoke จะช่วยให้มั่นใจได้ว่าระบบจะเพิกถอนสิทธิ์เข้าถึงเพื่อให้ผู้ใช้ไม่มีสิทธิ์เข้าถึงการซื้ออีกต่อไป และส่งสัญญาณที่ชัดเจนไปยัง Google Play ว่านักพัฒนาแอปปฏิเสธการซื้อ
  • สำหรับการสมัครใช้บริการ เมื่อมีการตั้งค่า 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 (รวมถึงการซื้อที่ยกเลิกอัตโนมัติซึ่งไม่มีการรับทราบ) ยกเลิกการซื้อ สำหรับการสมัครใช้บริการ โปรดทราบ ว่าการยกเลิกนี้หมายถึงการยกเลิก การซื้อการสมัครใช้บริการ ไม่ใช่ การยกเลิกการสมัครใช้บริการเอง
  • มีการเรียกเก็บเงินคืนสำหรับการซื้อ
  • นักพัฒนาแอปยกเลิกหรือคืนเงินคำสั่งซื้อของผู้ใช้ และเลือกตัวเลือก "เพิกถอน" ในคอนโซล คุณสามารถตัดสินใจเลือกแนวทางปฏิบัติได้โดยพิจารณาจากเหตุผลที่การซื้อถูกยกเลิกและนำข้อมูลเชิงพฤติกรรมของผู้ใช้ก่อนหน้านี้มาประกอบการพิจารณา เราขอแนะนำให้ใช้แนวทางปฏิบัติอย่างน้อย 1 ข้อต่อไปนี้

  • เรียกคืน: เมื่อการซื้อถูกยกเลิก คุณสามารถเรียกคืนไอเทมที่ไม่ได้ใช้ราวกับว่าไม่เคยมีการซื้อไอเทมเหล่านั้น ตัวอย่างเช่น หากการซื้อสกุลเงินในเกมถูกยกเลิก คุณก็เรียกคืนสกุลเงินที่มอบให้ผู้ใช้แล้วได้ ในกรณีที่ผู้ใช้ใช้สกุลเงินไปแล้ว ให้พิจารณาตั้งค่าสกุลเงินคงเหลือเป็นค่าติดลบและจำกัดกิจกรรมในแอปและการซื้อในอนาคตจนกว่าสกุลเงินคงเหลือจะเป็นค่าบวก

  • การใช้ระบบการเตือนหลายครั้ง: พิจารณาดำเนินการที่รุนแรงน้อยลงสำหรับผู้กระทำผิดครั้งแรก เช่น แสดงคำเตือนในแอป สำหรับผู้กระทำผิดซ้ำ ให้พิจารณาใช้มาตรการที่รุนแรงขึ้น

  • ปิดใช้การซื้อชั่วคราว: พิจารณาปิดใช้การซื้อสำหรับผู้ใช้ที่มีการซื้อที่ถูกยกเลิกจนกว่าคุณจะตรวจสอบอย่างละเอียดมากขึ้นว่าเหตุใดการซื้อจึงถูกยกเลิก ซึ่งคล้ายกับการใช้ระบบการเตือนหลายครั้ง

  • ไม่อนุญาตให้เข้าถึงแอปชั่วคราวหรือถาวร: สำหรับกรณีที่รุนแรงซึ่งมีการกระทำที่เป็นอันตรายซ้ำๆ ให้พิจารณาไม่อนุญาตให้เข้าถึงแอปชั่วคราวหรือถาวร

  • เรียกใช้ Voided Purchases API บ่อยๆ: เมื่อตรวจพบการซื้อที่ถูกยกเลิกอย่างน้อย 1 รายการ ให้พิจารณาเรียกใช้ Voided Purchases API บ่อยขึ้นเพื่อเรียกคืนการซื้อก่อนที่ผู้ใช้จะใช้การซื้อเหล่านั้นได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับโควต้า Voided Purchases API ได้ในเอกสารประกอบเกี่ยวกับ Voided Purchases API

ช่วย Google ตรวจหาการประพฤติมิชอบก่อนที่จะเกิดขึ้น

การประพฤติมิชอบบางประเภทเกี่ยวข้องกับผู้ใช้ที่เป็นอันตรายซึ่งสร้างบัญชี Google และบัญชีในแอปหลายบัญชีเพื่อซ่อนกิจกรรมของตน

ใช้เมธอด setObfuscatedAccountId และ setObfuscatedProfileId ใน Builder สำหรับ BillingFlowParams เพื่อช่วย Google แมปบัญชี Google กับ บัญชีในแอป

Google ใช้ข้อมูลนี้เพื่อตรวจหาพฤติกรรมที่น่าสงสัยและบล็อกธุรกรรมที่เป็นการฉ้อโกงบางประเภทก่อนที่จะดำเนินการเสร็จสมบูรณ์

การดำเนินการกับการละเมิดเครื่องหมายการค้าและลิขสิทธิ์

หากคุณใช้เซิร์ฟเวอร์ระยะไกลเพื่อส่งหรือจัดการเนื้อหา ให้แอปตรวจสอบสถานะการซื้อเนื้อหาที่ปลดล็อกแล้วทุกครั้งที่ผู้ใช้เข้าถึงเนื้อหา ซึ่งจะช่วยให้คุณเพิกถอนการใช้งานได้เมื่อจำเป็นและลดการละเมิดลิขสิทธิ์ หากเห็นว่ามีการเผยแพร่เนื้อหาของคุณซ้ำใน Google Play ให้ดำเนินการอย่างรวดเร็วและเด็ดขาด ดูรายละเอียดเพิ่มเติมได้ที่ หน้าคำถามที่พบบ่อยเกี่ยวกับลิขสิทธิ์ ในศูนย์ช่วยเหลือด้านลิขสิทธิ์