การเปิดเผย ID ฐานข้อมูล - ความเสี่ยงด้านความปลอดภัย?


134

ฉันได้ยินมาว่าการเปิดเผย ID ฐานข้อมูล (ใน URL เป็นต้น) เป็นความเสี่ยงด้านความปลอดภัย แต่ฉันมีปัญหาในการทำความเข้าใจว่าเหตุใด

มีความคิดเห็นหรือลิงก์ว่าเหตุใดจึงเสี่ยงหรือเหตุใดจึงไม่เป็นเช่นนั้น

แก้ไข: แน่นอนว่าการเข้าถึงนั้นถูกกำหนดขอบเขตไว้เช่นหากคุณไม่เห็นทรัพยากรfoo?id=123คุณจะได้รับหน้าข้อผิดพลาด มิฉะนั้น URL ควรเป็นความลับ

แก้ไข: หาก URL เป็นความลับอาจมีโทเค็นที่สร้างขึ้นซึ่งมีอายุการใช้งาน จำกัด เช่นใช้ได้ 1 ชั่วโมงและใช้ได้เพียงครั้งเดียว

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

คำตอบ:


109

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

ต่อไปนี้เป็นกฎที่ดีที่จะปฏิบัติตาม:

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

27
IMO การเพิ่ม ID ที่คาดเดาไม่ได้ถือเป็นแนวทาง "การรักษาความปลอดภัยผ่านการปิดบัง" และอาจนำไปสู่ความรู้สึกปลอดภัยที่ผิดพลาด ควรเน้นที่ (1) และ (2) ดีกว่าและตรวจสอบให้แน่ใจว่าการควบคุมการเข้าถึงของคุณมั่นคง
stucampbell

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

1
@stucampbell บางที แต่นั่นไม่ได้หมายความว่าคุณไม่ควรใช้ ID ที่คาดเดาไม่ได้เลย เกิดข้อบกพร่องขึ้นดังนั้น ID ที่คาดเดาไม่ได้จึงเป็นกลไกความปลอดภัยเพิ่มเติม นอกจากนี้การควบคุมการเข้าถึงไม่ได้เป็นเพียงเหตุผลเดียวที่จะใช้พวกเขา: รหัสที่คาดเดาได้สามารถเปิดเผยข้อมูลที่ละเอียดอ่อนเช่นจำนวนลูกค้าใหม่ภายในระยะเวลาที่กำหนด คุณไม่ต้องการเปิดเผยข้อมูลดังกล่าวจริงๆ
user247702

1
@Stijn คุณไม่สามารถพูดได้จริงๆว่าฉัน“ ไม่ต้องการ” ที่จะเปิดเผยจำนวนลูกค้าที่ฉันมี ฉันหมายถึงแมคโดนัลด์มีป้ายขนาดใหญ่บอกว่าพวกเขาเสิร์ฟแฮมเบอร์เกอร์ 10 พันล้านชิ้น ไม่ใช่ความเสี่ยงด้านความปลอดภัย แต่อย่างใด แต่เป็นความชอบ นอกจากนี้คุณต้องเข้าสู่ระบบก่อนจึงจะเห็น URL ใด ๆ ในแอปพลิเคชันส่วนใหญ่ซึ่งเราคงกังวลเกี่ยวกับเรื่องนี้อยู่ดี ดังนั้นเราจะรู้ว่าใครเป็นคนขูดข้อมูล
Wayne Bloss

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

47

แม้ว่าจะไม่ใช่ความเสี่ยงด้านความปลอดภัยของข้อมูลแต่ก็ถือเป็นความเสี่ยงด้านความปลอดภัยของระบบธุรกิจอัจฉริยะเนื่องจากเปิดเผยทั้งขนาดข้อมูลและความเร็ว ฉันเคยเห็นธุรกิจต่างๆได้รับอันตรายจากสิ่งนี้และได้เขียนเกี่ยวกับรูปแบบการต่อต้านนี้ในเชิงลึก เว้นแต่คุณจะสร้างการทดสอบและไม่ใช่ธุรกิจฉันขอแนะนำอย่างยิ่งให้เก็บรหัสส่วนตัวของคุณไว้ให้พ้นสายตาของสาธารณชน https://medium.com/lightrail/prevent-business-intelligence-leaks-by-using-uuids-instead-of-database-ids-on-urls-and-in-apis-17f15669fd2e


4
สุดท้ายคำตอบที่มีเหตุผลนำมาซึ่งแง่มุมอื่นที่ไม่ใช่ความเสี่ยงด้านความปลอดภัย
peceps

2
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ หากคุณคิดว่าผู้โจมตีสามารถข้ามความปลอดภัยของคุณได้ (ซึ่งคุณควรทำอยู่เสมอ) คุณไม่ต้องการเพียงแค่ส่งข้อมูลประเภทนี้ไป
Kriil

@Kriil พวกเขาไม่จำเป็นต้องเลี่ยงความปลอดภัยของคุณด้วยซ้ำ พวกเขาต้องสร้างบัญชี!
ปีเตอร์

32

ขึ้นอยู่กับว่า ID นั้นหมายถึงอะไร

พิจารณาไซต์ที่เหตุผลในการแข่งขันไม่ต้องการเปิดเผยต่อสาธารณะว่าพวกเขามีสมาชิกกี่คน แต่การใช้รหัสตามลำดับจะเปิดเผยเว็บไซต์ใน URL: http://some.domain.name/user?id=3933

ในทางกลับกันหากพวกเขาใช้ชื่อล็อกอินของผู้ใช้แทน: http://some.domain.name/user?id=someพวกเขาไม่ได้เปิดเผยอะไรที่ผู้ใช้ไม่รู้


2
หากคุณใช้รหัสต่อเนื่องคุณพูดถูก แต่ถ้าไม่เป็นเช่นนั้นก็จะไม่เปิดเผยอะไรเลย
orip

@orip: อย่างที่ฉันพูดมันขึ้นอยู่กับสิ่งที่ใครบางคนสามารถค้นพบได้โดยการตรวจสอบหลาย ๆ id มีรูปแบบหรือไม่? พวกเขาสามารถใช้ข้อมูลนั้นเพื่อรับข้อมูลที่ไม่ได้ตั้งใจจะมีได้หรือไม่?
บางที่

@ จอห์น: ขอบคุณสำหรับการแก้ไข ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน :)
บาง

6
ฉันได้ทำสิ่งนี้แล้ว: ใช้หมายเลขรหัสลำดับเพื่อกำหนดขนาดของฐานผู้ใช้ของคู่แข่ง
คาห์

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

25

แนวความคิดทั่วไปเป็นไปตามบรรทัดต่อไปนี้: "เปิดเผยข้อมูลเพียงเล็กน้อยเกี่ยวกับการทำงานภายในของแอปของคุณให้ทุกคนทราบ"

การเปิดเผย ID ฐานข้อมูลถือเป็นการเปิดเผยข้อมูลบางส่วน

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


1
การเข้าถึงทรัพยากรที่พวกเขาไม่ควรเห็น - เฉพาะในกรณีที่ฉันไม่ตรวจสอบสิทธิ์ (ซึ่งฉันทำไม่เช่นนั้นฉันมีปัญหาด้านความปลอดภัยอื่น) การเปิดเผยข้อมูลเกี่ยวกับ "การทำงานภายใน" นั่นคือคำถามของฉัน ทำไมถึงเป็นปัญหา?
orip

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

@Adam: การรักษาความปลอดภัยแบบผิวเผินอาจแย่กว่าการไม่มีความปลอดภัย หากไม่มีการรักษาความปลอดภัยคุณก็ชัดเจนด้วยการรักษาความปลอดภัยแบบผิวเผินคุณอาจคิดว่ามันเพิ่มสิ่งที่ไม่สามารถลบล้างได้
orip

16

เราใช้ GUID สำหรับรหัสฐานข้อมูล การรั่วไหลเป็นอันตรายน้อยกว่ามาก


นี่คือสิ่งที่ฉันจะแนะนำ มีโอกาสน้อยที่จะเดา GUID ในฐานข้อมูลของคุณ
Jon Erickson

6
สิ่งนี้มาพร้อมกับการลงโทษด้านประสิทธิภาพ ดูที่นี่
Jeshurun

2
สิ่งที่น่าสนใจ 1 เกี่ยวกับการใช้แนวทางคือคุณสามารถให้ลูกค้าสร้างรหัสฐานข้อมูลได้ สิ่งที่น่าสนใจ 2 คือพวกเขาไม่มีปัญหากับฐานข้อมูลที่แตกต่างกันเหมือนวิธีการเพิ่มรหัสอัตโนมัติ
Brian White

คุณใช้ GUID เหล่านี้ในโค้ด html เป็นแอตทริบิวต์ id เพื่อระบุผู้ใช้ความคิดเห็นโพสต์หรือไม่ หากต้องการระบุว่าผู้ใช้คลิกลิงก์ใดหรือต้องการแสดงความคิดเห็นในโพสต์ใด
trzczy

7

หากคุณกำลังใช้ ID จำนวนเต็มในฐานข้อมูลของคุณคุณอาจทำให้ผู้ใช้เห็นข้อมูลที่ไม่ควรทำได้โดยการเปลี่ยนตัวแปร qs

เช่นผู้ใช้สามารถเปลี่ยนพารามิเตอร์ id ใน qs นี้ได้อย่างง่ายดายและดู / แก้ไขข้อมูลที่ไม่ควรhttp: // someurl? id = 1


7
หากฉันไม่ตรวจสอบสิทธิ์แสดงว่ามีปัญหาด้านความปลอดภัยอื่น
orip

แต่คำตอบนั้นถูกต้อง: "อาจ"
Seun Osewa

1
คำถามไม่ใช่ว่าคุณจะตรวจสอบสิทธิ์ ถ้าการจ้างงานใหม่ที่คุณไม่รู้จักจะตรวจสอบสิทธิ์
Brian White

@BrianWhite - นั่นคือเหตุผลที่คุณต้องการกระบวนการตรวจสอบโค้ดเพื่อให้คุณสามารถให้ความรู้ก่อนที่จะเข้าสู่การผลิต
candu

2
สิ่งที่เราทำคือเข้ารหัสรหัสจำนวนเต็มเมื่อใช้ใน URL หรือตัวแปรฟอร์ม
Brian White

6

เมื่อคุณส่งรหัสฐานข้อมูลไปยังไคลเอนต์ของคุณคุณจะถูกบังคับให้ตรวจสอบความปลอดภัยในทั้งสองกรณี หากคุณเก็บรหัสไว้ในเซสชันเว็บของคุณคุณสามารถเลือกได้ว่าต้องการ / จำเป็นต้องทำหรือไม่ซึ่งหมายความว่าอาจมีการประมวลผลน้อยลง

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

ดังนั้นเราจึงใช้รหัสท้องถิ่นของเซสชันสังเคราะห์เพราะมันซ่อนไว้มากที่สุดเท่าที่เราจะทำได้

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


4
น่าสนใจแม้ว่าฉันจะคิดว่าการตรวจสอบอินพุตทั้งหมด (รวมถึงพารามิเตอร์ URL) สำหรับทุกคำขอนั้นเหมาะสมกับเว็บมาก
orip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.