ไทย

เครื่องมือสำหรับนักพัฒนา · ตัวสร้าง UUID

รหัสตามลำดับทำให้ข้อมูลธุรกิจรั่วไหล: เหตุใด API สาธารณะจึงเปิดเผย UUID

· เหตุใดจึงสำคัญ

uuid การเข้ารหัส เบราว์เซอร์-apis

แผนภาพที่ตัดกันรหัสตัวเลขตามลำดับซึ่งเปิดเผยรูปแบบการเติบโตด้วย UUID ทึบแสงที่ไม่เปิดเผยความก้าวหน้า
ภาพประกอบเวกเตอร์ต้นฉบับ ToolAcre

ID การเพิ่มอัตโนมัติจะบอกบุคคลภายนอกว่าคุณรับคำสั่งซื้อจำนวนเท่าใดและทำให้ทุกบันทึกสามารถนับได้ โพสต์นี้จะอธิบายสิ่งที่เปิดเผยการแก้ไข UUID สิ่งที่ไม่ได้แก้ไข และวิธีแนะนำการแก้ไขโดยไม่ต้องย้าย

หมายเลขใบแจ้งหนี้ของคุณกำลังบอกปริมาณของคุณแก่คู่แข่ง — ข้อมูลรั่วไหลใน /orders/10482

ตำแหน่งข้อมูล API ที่ส่งคืน /orders/10482 บอกบุคคลภายนอกมากกว่ารายละเอียดคำสั่งซื้อด้วยตนเอง ตัวระบุที่เป็นตัวเลขจะส่งสัญญาณว่าคุณได้ประมวลผลคำสั่งซื้ออย่างน้อยหมื่นรายการ ซึ่งบ่งบอกถึงข้อมูลเกี่ยวกับอัตราการเติบโตของคุณ และทำให้ทุกคำสั่งซื้อสามารถคาดเดาได้ การวนซ้ำอย่างง่ายผ่านหมายเลขตามลำดับจะดึงข้อมูลบันทึกทั้งหมดโดยไม่ต้องตรวจสอบการรับรองความถูกต้องหรือสิทธิ์ รูปแบบนี้จะปรากฏทุกที่—ใน URL, คีย์ฐานข้อมูล, หมายเลขใบแจ้งหนี้ และรหัสธุรกรรม—แม้ว่าระบบจะต้องมีการรับรองความถูกต้องเพื่อดูบันทึกใด ๆ ก็ตาม ปัญหาที่เกิดขึ้นประกอบกับการรายงานและการวิเคราะห์ ผู้โจมตีที่สามารถดึง /orders/1, /orders/2, และดำเนินการต่อผ่าน /orders/10482 จะได้รับมุมมองที่ครอบคลุมเกี่ยวกับประวัติการสั่งซื้อและแนวโน้มของคุณ

การแจงนับและการคัดลอก — วิธีที่ ID ตามลำดับเปลี่ยนเรกคอร์ดที่ถูกเปิดเผยหนึ่งเรกคอร์ดให้กลายเป็นเรกคอร์ดทั้งหมดได้อย่างไร

รูปแบบตามลำดับจะแสดงแนวโน้มว่าคำสั่งซื้อมาถึงเมื่อใด สินค้าใดที่ถูกกล่าวถึง และรูปแบบการกำหนดราคา ผู้สังเกตการณ์จะเรียนรู้ถึงอัตราที่ธุรกิจของคุณเติบโตหรือหดตัว ข้อมูลดังกล่าวซึ่งได้มาจากการแจงนับ ID เท่านั้นสามารถแจ้งกลยุทธ์การแข่งขัน ชี้แนะวิศวกรรมสังคม หรือแจ้งจังหวะเวลาสำหรับการโจมตีอื่นๆ การเปิดเผยไม่มีค่าใช้จ่ายใดๆ ในการค้นพบและปรากฏใน URL ประวัติเบราว์เซอร์ หน้าที่แคชไว้ และบันทึกเซิร์ฟเวอร์ สิ่งนี้ไม่ใช่ทฤษฎี: บริษัทข่าวกรองด้านการแข่งขันและวิศวกรที่อยากรู้อยากเห็นมักจะแยกการวัดทางธุรกิจจาก ID ที่เปิดเผยต่อสาธารณะ ตัวอย่างหมายเลขคำสั่งซื้อจะแสดงอัตราการผลิตและปริมาณรวมให้กับทุกคนที่มีแรงจูงใจเพียงพอที่จะรวบรวมข้อมูลและดำเนินการวิเคราะห์ขั้นพื้นฐาน

ปัญหารถถังเยอรมันในหนึ่งย่อหน้า - การประมาณผลรวมจากตัวอย่างตัวเลขตามลำดับ

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

สิ่งที่แก้ไข UUID — การอ้างอิงที่คาดเดาไม่ได้และไม่มีสัญญาณการเติบโตใน ID เอง

UUID ที่สร้างแบบสุ่มประกอบด้วย 122 bits ของเอนโทรปีเมื่อสร้างจากแหล่งที่ปลอดภัยด้วยการเข้ารหัสตามที่ RFC 9562 ระบุสำหรับเวอร์ชัน 4 ตัวระบุไม่สามารถคาดเดาได้ ไม่สามารถนับได้ และไม่เปิดเผยสิ่งใดเกี่ยวกับอัตราการเติบโตหรือปริมาณต่อผู้สังเกตการณ์ภายนอก ผู้โจมตีที่รู้ /orders/9a1f4e2b-7c3e-4d1a-8a5f-1b2c3d4e5f60 ไม่สามารถคาดเดา UUID ของลำดับถัดไปได้ หรือย้อนกลับผ่าน ID ประวัติของคุณด้วยความมั่นใจที่สมเหตุสมผล ตัว UUID จะกลายเป็นข้อมูลอ้างอิงที่ไม่ซ้ำใครแต่ทึบแสงโดยสิ้นเชิง การกระจายแบบสุ่มหมายถึงข้อความค้นหาหลายรายการไม่เปิดเผยรูปแบบ ไม่มีความคืบหน้า และไม่มีข้อมูลความเร็วแก่ผู้สังเกตการณ์ภายนอกที่ติดตาม API ของคุณ

สิ่งที่ UUID ไม่แก้ไข — ID ที่คาดเดาไม่ได้นั้นไม่ได้รับอนุญาต และความสับสนยังคงต้องมีการตรวจสอบการเข้าถึงเบื้องหลัง

การแทนที่ ID ตามลำดับด้วย UUID ใน API สาธารณะนั้นใช้งานได้ง่ายและไม่จำเป็นต้องมีการประสานงานที่ซับซ้อนระหว่างระบบ เพิ่มคอลัมน์ UUID ลงในตารางคำสั่งซื้อของคุณ สร้างคอลัมน์หนึ่งสำหรับคำสั่งซื้อใหม่ทุกรายการ แสดง UUID ในการตอบกลับ และค่อยๆ เลิกใช้งานคีย์ตัวเลข ระบบภายในของคุณสามารถใช้คีย์หลักจำนวนเต็มต่อไปเพื่อประสิทธิภาพและความเรียบง่าย เฉพาะการเปลี่ยนแปลงอินเทอร์เฟซสาธารณะเท่านั้น ID ลำดับเก่ายังคงอยู่ในฐานข้อมูลสำหรับการอ้างอิงหรือเส้นทางการตรวจสอบของคุณเอง แต่ลูกค้าและบุคคลที่สามจะเห็นเฉพาะ UUID แนวทางแบบคีย์คู่นี้เป็นแนวทางปฏิบัติที่ดีที่สุดในการรักษาประสิทธิภาพของดัชนีที่มีอยู่ในขณะเดียวกันก็เปิดเผยตัวระบุที่ทึบแสงสู่โลกภายนอก

ตัวอย่างการทำงาน - เพิ่มคอลัมน์ UUID สาธารณะข้างคีย์จำนวนเต็มภายในและเปิดเผยเฉพาะคอลัมน์แรก

วิธีการนี้แตกต่างจากการให้สิทธิ์จริง เนื่องจาก UUID ไม่ใช่รหัสผ่าน และความสับสนไม่ใช่การควบคุมความปลอดภัย ลูกค้าที่มีสิทธิ์เข้าถึง /orders/{their-uuid} อย่างถูกต้องตามกฎหมายควรจะสามารถดูได้ แต่ /orders/{someone-elses-uuid} จะต้องยังคงถูกปฏิเสธโดยการตรวจสอบการเข้าถึงของคุณ UUID ซ่อนหมายเลขคำสั่งซื้อจากการตรวจสอบทั่วไปและป้องกันการวิเคราะห์ทางสถิติผ่านการแจงนับ แต่ตรรกะการตรวจสอบสิทธิ์และการอนุญาตของคุณยังคงเป็นความรับผิดชอบของรหัสแอปพลิเคชันของคุณ การป้องกันเป็นแบบหลายชั้น: UUID หยุดการรั่วไหลของข้อมูลในตัวระบุเอง และการควบคุมการเข้าถึงจะบังคับใช้ว่าใครอาจดำเนินการกับตัวระบุนั้น

สิ่งนี้ไม่ครอบคลุม — การแลกเปลี่ยนประสิทธิภาพดัชนีของคีย์สุ่ม ซึ่งจะกล่าวถึงในโพสต์แยกต่างหาก

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

Takeaway: แยกการอ้างอิงสาธารณะออกจากคีย์ภายใน — ตัวสร้าง ToolAcre จัดหา UUID ที่ได้รับการสนับสนุน CSPRNG สำหรับฝั่งสาธารณะ

การย้ายข้อมูลในทางปฏิบัติจะช่วยหลีกเลี่ยงวันสำคัญโดยค่อยๆ รองรับทั้งสองรูปแบบ หากคุณกำหนดเวอร์ชันปลายทางของคุณ v1 API สามารถส่งคืน ID จำนวนเต็มต่อไปได้ ในขณะที่ v2 ส่งคืน UUID ลูกค้าเปลี่ยนผ่านได้ตามความต้องการโดยไม่ต้องมีการประสานงานกัน การสืบค้นฐานข้อมูลภายในของคุณยังคงไม่เปลี่ยนแปลง: ยังคงกรองตามรหัสจำนวนเต็มเนื่องจากดัชนีของคุณสร้างขึ้นบนคอลัมน์นั้นและคีย์ต่างประเทศของคุณอ้างอิง เฉพาะข้อมูลที่ส่งคืนไปยังไคลเอนต์เท่านั้นที่เปลี่ยนแปลง ตัวสร้าง ToolAcre UUID สร้างรูปแบบเวอร์ชัน-4 ที่คุณจะใช้ แต่ละเอาต์พุตเป็น RFC 9562 UUID ที่ถูกต้อง ซึ่งพร้อมสำหรับพื้นที่จัดเก็บ การปรับใช้ และสถานการณ์การย้ายแบบค่อยเป็นค่อยไป