บั๊กคู่แฝดพังระบบจ่ายเงิน AI บน APEX Versus
ผู้พัฒนา APEX Versus เผยฟีเจอร์วิเคราะห์ AI พังสองเด้ง ผู้ใช้ฟรีเรียกใช้ได้ฟรีโดยไม่ต้องจ่ายเงิน ขณะที่ลูกค้า Pro กลับมองไม่เห็นปุ่มใช้งาน

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- ฟีเจอร์ Deep Analysis บนเว็บไซต์ APEX Versus เกิดข้อผิดพลาดร้ายแรงสองจุดพร้อมกัน
- ฝั่งเซิร์ฟเวอร์ไม่ได้ตรวจสอบการจ่ายเงิน ทำให้ผู้ใช้ทั่วไปเรียก API ได้ฟรีไม่มีอั้น
- ลูกค้าแพ็กเกจ Pro ที่เสียเงินจริงกลับมองไม่เห็นปุ่มใช้งานเนื่องจากโค้ด UI ถูกซ่อนไว้
- นักพัฒนาต้องแก้ไขระบบตรวจสอบสิทธิ์ฝั่งเซิร์ฟเวอร์และปรับปรุงการหักเครดิตให้ทำงานจริง
Param Jaisinghani ผู้พัฒนาเว็บไซต์เปรียบเทียบ AI อย่าง "APEX Versus" ได้ออกมาบอกเล่าประสบการณ์สุดช็อกหลังตรวจโค้ดครั้งใหญ่ เมื่อพบว่าฟีเจอร์วิเคราะห์เชิงลึกที่เรียกว่า "Deep Analysis" และ "Advanced Analysis" ซึ่งเป็นบริการแบบเสียเงิน กลับมีข้อผิดพลาดซ่อนอยู่ถึงสองจุดในเวลาเดียวกัน และความผิดพลาดทั้งสองฝั่งดันหักล้างกันเองจนระบบดูเหมือนปกติในตอนแรก
ปัญหาแรกคือระบบกำแพง paywall ไม่มีอยู่จริงบนฝั่งเซิร์ฟเวอร์ โดยหน้าเว็บไซต์ฝั่ง frontend มีการตรวจสอบเครดิตก่อนเรียกใช้งาน API ก็จริง แต่ตัว API หลักอย่าง POST /api/compare กลับไม่มีการตรวจสอบอะไรเลย ใครก็ตามที่ส่งคำขอพร้อมโหมด advanced ไปยังเซิร์ฟเวอร์โดยไม่ต้องมี auth header จะสามารถใช้งานโมเดล Gemini และรับผลลัพธ์กลับมาได้ทันที โดยไม่ต้องเข้าสู่ระบบ ไม่ต้องมีเครดิต และไม่มีการจำกัดโควต้าประจำวัน
ปัญหาที่สองกลับตรงกันข้ามอย่างสิ้นเชิง เพราะฟีเจอร์นี้ดันถูกซ่อนจากผู้ใช้งานที่ยอมควักกระเป๋าจ่ายเงินจริง โดยโค้ดแสดงผลระบุเงื่อนไขซ่อนการ์ดฟีเจอร์ดังกล่าวเมื่อผู้ใช้อยู่ในแพ็กเกจที่ต้องจ่ายเงิน ทำให้ปุ่ม "Advanced Analysis" ของสมาชิก Pro กลายเป็นโค้ดตายที่ไม่มีฟังก์ชันไหนเรียกใช้งานเลยตั้งแต่วันแรกที่เขียนขึ้นมา
เหตุการณ์นี้นับเป็นกรณีศึกษาชั้นดีในหมู่นักพัฒนาซอฟต์แวร์เกี่ยวกับความปลอดภัยของระบบ API และ Paywall โดยทั่วไป หากนักพัฒนาพึ่งพาการตรวจสอบสิทธิ์เพียงแค่ฝั่งไคลเอนต์ (Client-side) เช่น การซ่อนปุ่มหรือเช็กสถานะบนหน้าจอ ระบบจะมีความเปราะบางสูงมาก เพราะแฮกเกอร์หรือผู้ใช้ทั่วไปสามารถข้ามหน้า UI ไปยิง API ตรงๆ ได้เสมอ การตรวจสอบที่แท้จริงจึงต้องเกิดขึ้นที่ฝั่งเซิร์ฟเวอร์ (Server-side) เท่านั้น
สาเหตุรากเหง้าของเรื่องนี้มาจากการที่ผู้พัฒนาได้อัปเดตกฎความปลอดภัยของ Firestore ให้เครดิตสามารถถูกเขียนได้เฉพาะฝั่งเซิร์ฟเวอร์ผ่าน admin SDK เพื่อป้องกันการแฮกเครดิต แต่ลืมอัปเดตโค้ดเก่าที่พยายามเขียนเครดิตจากเบราว์เซอร์ ทำให้โค้ดพยายามทำงานอยู่เรื่อยๆ แต่ล้มเหลวแบบเงียบๆ ทุกครั้ง ส่งผลให้ระบบล่มแบบไม่แสดง Error ออกมาให้เห็น

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
หลังจากค้นพบสาเหตุ การแก้ไขจึงทำได้โดยการเขียนโค้ดตรวจสอบสิทธิ์และระบบตัดเครดิตใหม่บนเซิร์ฟเวอร์ จากนั้นทดสอบจริงด้วยบัญชี Pro พบว่ายอดเครดิตลดลงไป 2 แต้มทันทีแบบอัตโนมัติ ซึ่งถือเป็นครั้งแรกในประวัติศาสตร์ของฟีเจอร์นี้ที่การหักเครดิตเกิดขึ้นจริงหลังใช้งาน
"การตรวจสอบฝั่งไคลเอนต์และฝั่งเซิร์ฟเวอร์ไม่ใช่ฟีเจอร์เดียวกัน เพียงเพราะมันมองหาตัวแปรตัวเดียวกัน อันหนึ่งเป็นแค่คำแนะนำ แต่อีกอันคือสิ่งเดียวที่ใช้งานได้จริง"
Param Jaisinghani
สุดท้ายนี้ ผู้พัฒนาได้ฝากข้อคิดเตือนใจสำหรับใครก็ตามที่กำลังทำระบบเครดิตหรือ Paywall ว่าควรตรวจสอบโค้ดทุกจุดที่มีการเช็กยอดคงเหลือ และลองจินตนาการดูว่าระบบนั้นจะรอดพ้นหรือไม่หากมีคนจงใจข้ามหน้าเว็บไปยิง API ตรงๆ หากคำตอบต้องขึ้นต้นด้วยคำว่า "ควรจะ" แปลว่าระบบนั้นยังไม่ได้ถูกบังคับใช้อย่างแท้จริง
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น