Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ตอนที่หนึ่งของชุดนี้ครอบคลุมการจู่โจมแบบฉีด

ในบทความที่ 2 ของซีรีส์เกี่ยวกับ OWASP Top 10 Web Application Security Risks เราจะเจาะลึกเข้าไปในจักรวาลของการพิสูจน์ตัวตนที่เสียหายและภัยคุกคามการเปิดเผยข้อมูล

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

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

นอกจากนี้ เราจะลงรายละเอียดเกี่ยวกับข้อมูลที่ละเอียดอ่อนซึ่งไม่ได้รับการปกป้องอย่างเพียงพอ ซึ่งจะทำให้มีที่ว่างสำหรับช่องโหว่ต่างๆ ดังต่อไปนี้:

  • การจัดเก็บข้อมูลที่ละเอียดอ่อนที่ไม่ปลอดภัย :เมื่อข้อมูลที่ละเอียดอ่อนถูกเข้ารหัสด้วยอัลกอริธึมที่อ่อนแอ เช่น MD5
  • การเปิดเผยข้อมูลที่ละเอียดอ่อน :เมื่อนักพัฒนาเปิดเผยข้อมูลที่ละเอียดอ่อนที่ไม่ได้เข้ารหัสโดยไม่ได้ตั้งใจใน URL หรือฟิลด์ที่ซ่อนอยู่ เป็นต้น

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

กระโดดเข้าไปเลย!

ภัยคุกคามการตรวจสอบสิทธิ์

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

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

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

การแจงนับผู้ใช้

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

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

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

หน้าเข้าสู่ระบบ Facebook

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

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ข้อความชื่อผู้ใช้ไม่ถูกต้อง

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

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

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ข้อความรหัสผ่านไม่ถูกต้อง

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

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

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

ภัยคุกคามในการดำเนินการ

ในแอป RailsGoat ให้เปิด user.rb ไฟล์ใน app/models โฟลเดอร์และค้นหา authenticate กระบวนการ. ภายในนั้น คุณอาจพบข้อมูลโค้ดต่อไปนี้:

raise "#{email} doesn't exist!" if !(user)
if user.password == Digest::MD5.hexdigest(password)
  auth = user
else
  raise "Incorrect Password!"
end

อย่างแน่นอน! ข้อความถูกตั้งค่าเพื่อให้ผู้โจมตีทราบว่าผู้ใช้ไม่มีอยู่จริงหรือรหัสผ่านไม่ถูกต้อง

ทดสอบออก ไปที่หน้าเข้าสู่ระบบ RailsGoat แล้วพิมพ์อีเมลและรหัสผ่านแบบสุ่ม คุณอาจเห็นข้อความแสดงข้อผิดพลาดต่อไปนี้:

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ไม่มีผู้ใช้รายนี้

มิฉะนั้น ถ้ามีผู้ใช้อยู่ (ken@metacorp.com ตัวอย่างเช่น) แต่รหัสผ่านไม่ถูกต้อง ข้อความต่อไปนี้จะปรากฏขึ้น:

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

รหัสผ่านไม่ถูกต้อง

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

วิธีแก้ปัญหานี้

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

ภายใน sessions_controller.rb (app/controllers โฟลเดอร์) ค้นหา create เมธอดและเปลี่ยนข้อมูลโค้ดต่อไปนี้

flash[:error] = e.message

ดังต่อไปนี้:

flash[:error] = "Your credentials aren't valid."

ตอนนี้ ทุกครั้งที่ผู้ใช้พิมพ์ชื่อผู้ใช้หรือรหัสผ่านผิด นั่นคือข้อความที่พวกเขาจะได้รับ:

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ข้อมูลประจำตัวไม่ถูกต้อง

อีกวิธีในการดำเนินการคือเปลี่ยนข้อความสองข้อความภายใน users.rb รุ่น

รหัสผ่านที่อ่อนแอ

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

นี่เป็นหนึ่งในขั้นตอนที่สำคัญที่สุดในการป้องกันการแจงนับผู้ใช้

ภัยคุกคามในการดำเนินการ

ใน RailsGoat ให้เปิด user.rb ไฟล์และค้นหาโค้ดบรรทัดแรกก่อนนิยามคลาส:

validates :password,
    presence: true,
    confirmation: true,
    length: {
      within: 6..40
    },

    ...

นี่เป็นตัวอย่างที่ชัดเจนของรหัสผ่านที่ถูกตรวจสอบอย่างไม่รัดกุม เนื่องจากมีการตรวจสอบเฉพาะความยาวเท่านั้น

วิธีแก้ปัญหานี้

การแก้ปัญหาค่อนข้างง่าย ตรวจสอบรหัสผ่านของคุณกับข้อกำหนดที่เข้มงวดกว่านี้ เช่น:

  • อย่างน้อย 1 ตัวพิมพ์เล็กและ 1 ตัวพิมพ์ใหญ่
  • อย่างน้อย 1 หลัก
  • อย่างน้อย 10 ตัวอักษร

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

ในการแก้ปัญหานี้ภายใน RailsGoat เพียงแทนที่คุณสมบัติ length ด้วยค่าต่อไปนี้:

:format => {:with => /\A.*(?=.*[a-zA-Z])(?=.*[0-9])(?=.{10,}).*\z/},

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

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

รหัสผ่านไม่ถูกต้อง

คุกกี้ไม่จำกัด

ในบทความก่อนหน้านี้ เราได้อุทิศเวลาบางส่วนเพื่อทำความเข้าใจว่าการโจมตี XSS เกิดขึ้นได้อย่างไร เนื่องจากเกิดขึ้นโดยอนุญาตให้ผู้โจมตีเรียกใช้สคริปต์ที่เป็นอันตราย ข้อมูลสำคัญอาจถูกขโมยจากคุกกี้ของเซสชัน หากเราไม่ป้องกันการเข้าถึงแอตทริบิวต์ เช่น document.cookie ในโค้ด JavaScript ของคุณ

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

ในทางกลับกัน คุกกี้จะปลอดภัยขึ้นเล็กน้อยหากคุณทำตามขั้นตอนที่ถูกต้องเพื่อสร้างคุกกี้ เช่น การตั้งค่า HttpOnly ธง.

กล่าวโดยย่อ คุกกี้ที่เก็บข้อมูลเซสชันและตั้งค่าด้วย HttpOnly ไม่สามารถเข้าถึงการตั้งค่าสถานะจาก JavaScript Document.cookie เอพีไอ วิธีนี้เฉพาะเซิร์ฟเวอร์เท่านั้นที่จะได้รับ

นอกจากนี้เรายังมี Secure ซึ่งจะทำให้มั่นใจได้ว่าคุกกี้จะถูกส่งไปยังเซิร์ฟเวอร์ก็ต่อเมื่อ (และก็ต่อเมื่อ) คำขอเกิดขึ้นภายใน HTTPS (ไม่เคยอยู่ใน HTTP) การทำเช่นนี้จะทำให้คำขอของคุณปลอดภัยยิ่งขึ้นในกรณีที่มีคนดมกลิ่นว่าเป็นคนกลาง .

ภัยคุกคามในการดำเนินการ

Rails ช่วยคุณด้วยการตั้งค่าคุกกี้ทั้งหมดโดยอัตโนมัติด้วย HttpOnly ธง. วิธีนี้ยอดเยี่ยมเพราะช่วยให้นักพัฒนาที่ไม่รู้ตัวหลีกเลี่ยงการถูกแฮ็กแอป

ในการทดสอบตัวอย่างนี้ เราต้องปิดการใช้งานคุณสมบัตินี้ ซึ่ง RailsGoat ทำอย่างชัดเจนภายใน session_store.rb ไฟล์ที่อยู่ใน config/initializers โฟลเดอร์ ลองดูสิ!

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

<script>
  alert(document.cookie);
</script>

เมื่อคุณส่งแบบฟอร์ม ระบบจะสร้างผู้ใช้พร้อมกับข้อความแจ้งเตือนต่อไปนี้:

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ข้อความแจ้งเตือนเปิดเผยคุกกี้เซสชัน RailsGoat

วิธีแก้ปัญหานี้

ในกรณีนี้ ค่อนข้างตรงไปตรงมา อย่าปิดการใช้งาน HttpOnly ตั้งค่าสถานะในแอป Rails ของคุณ

ดังนั้น ให้ลบ httponly: false การตั้งค่าและรีสตาร์ทเซิร์ฟเวอร์ เมื่อคุณพยายามดำเนินการแบบเดียวกัน ข้อความเตือนต่อไปนี้จะปรากฏขึ้น:

ภัยคุกคามด้านความปลอดภัยของ Rails:การตรวจสอบสิทธิ์

ไม่มีข้อความแจ้งเตือน

สถานการณ์อื่นๆ

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

การปิดแท็บเบราว์เซอร์เพียงอย่างเดียวไม่เพียงพอต่อการออกจากระบบแอปพลิเคชัน

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

อย่างไรก็ตาม นี่คือครึ่งทางของการโจมตีด้วยการขโมย

การเปิดเผยข้อมูลที่ละเอียดอ่อน

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

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

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

ต่อไปนี้คือตัวอย่างที่ชัดเจนของช่องโหว่นี้:

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

มาวิเคราะห์สถานการณ์ทั่วไปบางส่วนกัน

ที่เก็บข้อมูลที่มีความละเอียดอ่อนที่ไม่ปลอดภัย

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

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

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

ภัยคุกคามในการดำเนินการ

ดังที่เราได้เห็นแล้ว RailsGoat ตั้งใจเก็บรหัสผ่านของผู้ใช้ไว้เป็นแฮช MD5 คุณสามารถดูสิ่งนี้ได้ใน user.rb รุ่น:

def hash_password
  if self.password.present?
      self.password = Digest::MD5.hexdigest(password)
  end
end

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

วิธีแก้ปัญหานี้

มีหลายวิธีในการแก้ไขปัญหานี้ แต่บางทีวิธีหนึ่งที่มีชื่อเสียงที่สุดคือการใช้แฮชเกลือ เช่น วิธีที่ BCrypt จัดหาให้

แม้ว่า Rails จะมาพร้อมกับความสามารถเริ่มต้นในการจัดการกับ Bcrypt แต่ lib ที่มีชื่อเสียงก็ถูกใช้อย่างกว้างขวางเพื่อจุดประสงค์นี้:bcrypt-ruby:

gem install bcrypt

เมื่อคุณแมปโมเดลของคุณกับโมเดล รหัสผ่านจะถูกตั้งค่าและรับจากฐานข้อมูลอย่างไร lib ปรับทุกอย่างอื่นโดยอัตโนมัติ:

require 'bcrypt'

class User < ActiveRecord

  include BCrypt

  def password
    @password ||= Password.new(password_hash)
  end

  def password=(new_password)
    @password = Password.create(new_password)
    self.password_hash = @password
  end
end

อย่างไรก็ตาม โฟลว์ต้องการคอลัมน์สตริงเพิ่มเติม (password_hash ) ที่ตารางเพื่อจัดเก็บแฮชรหัสผ่านสำหรับอัลกอริธึม BCrypt

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

เปิดเผยมากเกินไป

ไม่ว่าคุณจะทำงานกับ REST API หรือจุดปลาย GraphQL ตรวจสอบให้แน่ใจว่าได้ส่งคืนเฉพาะที่จำเป็นเพื่อให้ไคลเอ็นต์ทำงานได้

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

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

ภัยคุกคามในการดำเนินการ

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

เปิด users_controller.rb ไฟล์ใน api/v1 โฟลเดอร์ คุณจะพบวิธีการดังต่อไปนี้:

def show
  respond_with @user.as_json
end

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

ไม่ใช่แค่ user โมเดลแต่รวมถึงโมเดลอื่นๆ ที่มีข้อมูลที่ละเอียดอ่อนจำเป็นต้องเลือกแอตทริบิวต์ที่ API จะมองเห็นได้

วิธีแก้ปัญหานี้

โชคดีที่ Rails มีวิธีที่ง่ายมากในการจัดการกับมัน เรามาแทนที่ as_json . กัน ด้วยวิธีการดังต่อไปนี้:

def as_json
  super(only: [:id, :email])
end

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

สรุปผล

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

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

แล้วพบกันใหม่ป้ายหน้า!