วิธีที่ดีที่สุดในการติดตั้ง“ จดจำฉัน” สำหรับเว็บไซต์คืออะไร [ปิด]


510

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

นอกจากนี้ยังมีข้อผิดพลาดทั่วไปในการระวังไม่ให้คุกกี้นี้แสดงจุดอ่อนด้านความปลอดภัยซึ่งสามารถหลีกเลี่ยงได้ในขณะที่ยังคงให้ฟังก์ชัน 'จดจำฉัน'


5
ตรวจสอบstackoverflow.com/questions/549/… (ส่วนที่ II ของคำตอบยอดนิยม)
Frosty Z

ถ้าคุณใช้ ASP.NET ลองดูcodeproject.com/Articles/779844/Remember-Me
Believe2014

1
มีข้อมูลที่เป็นประโยชน์มากกว่าใน Security SE ~ security.stackexchange.com/questions/19676/…
b1nary.atr0phy

คำตอบที่ได้รับการยอมรับในปัจจุบันโดย splattne ซับซ้อนเกินไป สร้างโทเค็น +16 ไบต์จากแหล่งที่มาแบบสุ่มแฮชแล้วบันทึกรหัสแฮช + บัญชีในฐานข้อมูล จากนั้นส่งโทเค็นไปยังผู้ใช้ (เข้ารหัส base64) ใน HTTPS + httpOnly cookie (เพื่อให้ Javascript ไม่สามารถเข้าถึง / ขโมยได้) ด้วยวิธีนี้ไม่มีใครสามารถเดาโทเค็นหรือออกจากระบบผู้คนด้วยการเดาที่ไม่ถูกต้อง แต่แม้ว่าฐานข้อมูลของคุณจะถูกแฮ็กก็ไม่มีใครสามารถใช้โทเค็นในฐานข้อมูลได้ (พวกเขาถูกแฮช) ดังนั้นเฉพาะลูกค้าดั้งเดิม (หรือคนที่ขโมยโทเค็นจากร้านเบราว์เซอร์อย่างใด) จึงสามารถใช้ได้
Xeoncross

คำตอบ:


536

ปรับปรุงการเข้าสู่ระบบคุกกี้ถาวรแบบฝึกหัดที่ดีที่สุด

คุณสามารถใช้กลยุทธ์นี้ที่อธิบายไว้ที่นี่เป็นแนวทางปฏิบัติที่ดีที่สุด (2006) หรือกลยุทธ์ที่ปรับปรุงที่อธิบายไว้ที่นี่ (2015):

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

วิธีการนี้ให้การป้องกันในเชิงลึก หากใครบางคนจัดการกับการรั่วไหลของตารางฐานข้อมูลมันจะไม่เปิดประตูให้ผู้โจมตีที่ปลอมตัวเป็นผู้ใช้


20
ดูเพิ่มเติมที่: stackoverflow.com/questions/549/...คุณไม่ควรอ่าน 'ดีขึ้น' รุ่น
Jacco

8
ปัญหานี้คือคุณเปิดเผยชื่อผู้ใช้ในคุกกี้แม้ว่านี่จะเป็นสิ่งที่ Gmail ทำ เหตุใดคุณจึงต้องมีทั้งรหัสประจำเครื่องและโทเค็น โทเค็นที่ใหญ่กว่านี้จะไม่เป็นไรหรือ
Dan Rosenstark

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

24
@HiroProtagonist Series Identifier คือการป้องกันการโจมตี DoS หากไม่มีมันฉันสามารถเขียนสคริปต์ไปที่ไซต์ของคุณด้วยชื่อผู้ใช้ทุกคนและโทเค็นที่ไม่ถูกต้องและออกจากระบบทุกคนในเว็บไซต์ของคุณ
Chris Moschini

6
วิธีการแก้ปัญหานี้คือผิดมันไม่จัดการกับ cuncurrency: หากมีการร้องขอการพิสูจน์ตัวตนของ Remember-me สองครั้งในเวลาเดียวกันพร้อมกับคุกกี้ Remember-me เดียวกันสิ่งแรกที่ทำสำเร็จและเปลี่ยนโทเค็น การเตือนที่ผิดพลาด (เนื่องจากโทเค็นเปลี่ยนไปแล้วโดยคำขอแรก) (สถานการณ์นี้อาจเกิดขึ้นได้เมื่อเบราว์เซอร์เริ่มทำงานและไซต์นั้นได้รับการกู้คืนในสองแท็บของเบราว์เซอร์)
slobo

9

ฉันจะเก็บ ID ผู้ใช้และโทเค็น เมื่อผู้ใช้กลับมาที่ไซต์ให้เปรียบเทียบข้อมูลทั้งสองชิ้นกับบางสิ่งที่คงอยู่เช่นรายการฐานข้อมูล

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


8

เก็บ ID ผู้ใช้และ RememberMeToken เมื่อพวกเขาเข้าสู่ระบบด้วยจดจำฉันตรวจสอบสร้างใหม่ RememberMeToken (ซึ่งทำให้เครื่องอื่น ๆ ที่มีการทำเครื่องหมายเป็นโมฆะจำฉัน)

เมื่อพวกเขากลับมาค้นหาพวกเขาด้วยโทเค็นจดจำฉันและตรวจสอบว่า UserId ตรงกัน


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

4

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

เหตุผลที่แน่นอนคือคุกกี้ของคุณที่มีเซสชันถาวรของคุณนั้นถูกขโมยง่าย

4 วิธีในการขโมยคุกกี้ของคุณ (จากความคิดเห็นของ Jens Rolandบนหน้าเว็บ@splattneตามคำตอบของเขา):

  1. โดยการดักจับมันผ่านสายที่ไม่ปลอดภัย (การดักจับแพ็คเก็ต / การแย่งชิงเซสชัน)
  2. โดยการเข้าถึงเบราว์เซอร์ของผู้ใช้โดยตรง (ผ่านมัลแวร์หรือการเข้าถึงกล่อง)
  3. โดยอ่านจากฐานข้อมูลเซิร์ฟเวอร์ (อาจเป็น SQL Injection แต่อาจเป็นอะไรก็ได้)
  4. โดย XSS Hack (หรือการใช้ประโยชน์จากฝั่งไคลเอ็นต์ที่คล้ายคลึงกัน)

104
1. HTTPS ออกแบบมาเพื่อป้องกันสิ่งนี้ 2. เข้าสู่ระบบอย่างต่อเนื่องไม่ใช่ปัญหาด้านความปลอดภัยที่นี่คุณมีปัญหาที่ใหญ่กว่า 3. เหมือนกับ 2. 4. สิ่งนี้สามารถป้องกันได้โดยนโยบายการควบคุมการเข้าถึงและการสุขาภิบาลที่ดี หากคุณไม่ทำตามขั้นตอนเหล่านี้แสดงว่าคุณมีปัญหาที่ใหญ่กว่าการลงชื่อเข้าใช้อย่างสม่ำเสมอ
Chris Moschini
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.