GO Code Review #1 : ข้อมูลรับรองแบบฮาร์ดโค้ดมีความสำคัญต่อความปลอดภัย

ภาพรวม
ผู้ตรวจสอบประเมินคุณภาพของโค้ด ความสามารถในการบำรุงรักษา และการปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุด ฉันกังวลเป็นพิเศษกับการค้นหาช่องโหว่ด้านความปลอดภัยและสถานที่ที่ต้องซ่อมแซม เกี่ยวกับข้อมูลประจำตัวแบบฮาร์ดโค้ด รายงานนี้เน้นปัญหาด้านความปลอดภัยที่สำคัญอย่างหนึ่ง
ตัวอย่างรหัสที่ละเอียดอ่อน
func connect() {
user := "root"
password:= "supersecret" // Sensitive
url := "login=" + user + "&passwd=" + password
}
ข้อมูลโค้ดที่ให้มาดูเหมือนจะเป็นฟังก์ชันชื่อconnect()ที่มีหน้าที่สร้างการเชื่อมต่อ ซึ่งอาจเชื่อมต่อกับบริการหรือระบบ นี่คือการวิเคราะห์โดยละเอียดของรหัส:
func connect() {
user := "root"
password := "supersecret" // Sensitive
url := "login=" + user + "&passwd=" + password
}
- รหัสผ่านที่ละเอียดอ่อน:เนื่องจากมองเห็นได้โดยตรงในซอร์สโค้ด ค่ารหัสผ่านแบบตายตัว “ความลับสุดยอด” จึงถือเป็นความละเอียดอ่อน เนื่องจากข้อพิจารณาด้านความปลอดภัย จึงไม่แนะนำให้ฮาร์ดโค้ดข้อมูลประจำตัว เช่น รหัสผ่าน ลงในซอร์สโค้ด ใครก็ตามที่เข้าถึง codebase ได้อาจตรวจสอบรหัสผ่านได้อย่างง่ายดาย
- การสร้าง URL:ตัวแปรผู้ใช้และรหัสผ่านจะรวมกับอินพุตเพิ่มเติมเพื่อสร้างสตริง URL ดูเหมือนว่าจะสร้าง URL สำหรับคำขอเข้าสู่ระบบ โดยมีพารามิเตอร์การค้นหาสำหรับผู้ใช้และรหัสผ่าน
- ความเสี่ยงด้านความปลอดภัย:มีความเสี่ยงด้านความปลอดภัยที่ร้ายแรงเมื่อข้อมูลที่เป็นความลับ เช่น รหัสผ่าน ถูกเก็บไว้ในซอร์สโค้ดในรูปแบบข้อความธรรมดา ข้อมูลที่ละเอียดอ่อนสามารถถูกนำไปใช้ในทางที่ผิดได้อย่างง่ายดาย หากโค้ดเบสถูกดูโดยผู้ที่ไม่ได้รับอนุญาต หรือที่เก็บข้อมูลถูกแฮ็ก
2. การจัดการข้อมูลประจำตัว: เป็นการยากที่จะเปลี่ยนหรือหมุนเวียนรหัสผ่านตามความจำเป็น เมื่อเก็บไว้ในรหัสโดยตรง ข้อบกพร่องด้านความปลอดภัยที่อาจเกิดขึ้นอาจเป็นผลมาจากข้อมูลประจำตัวแบบฮาร์ดโค้ดที่สามารถคงอยู่ใน codebase แม้ว่าจะเปลี่ยนรหัสผ่านแล้วก็ตาม
คำแนะนำ: ใช้เครื่องมือการจัดการความลับหรือโซลูชันการจัดการข้อมูลรับรองที่ปลอดภัยเพื่อจัดเก็บและจัดการข้อมูลประจำตัวที่ละเอียดอ่อนอย่างปลอดภัย โซลูชันเหล่านี้มีความสามารถ เช่น การหมุนเวียนข้อมูลลับอัตโนมัติ นอกเหนือไปจากพื้นที่เก็บข้อมูลที่ปลอดภัย การจัดการการเข้าถึง และคุณสมบัติอื่นๆ
3. การตรวจสอบอินพุต: อินพุตของผู้ใช้ต้องผ่านการตรวจสอบและฆ่าเชื้อ โดยเฉพาะอย่างยิ่งเมื่อสร้าง URL หรือเรียกใช้การสืบค้นฐานข้อมูล การขาดการตรวจสอบความถูกต้องและการฆ่าเชื้อในรหัสที่ให้มาทำให้ระบบเปิดช่องโหว่ด้านความปลอดภัย เช่น การฉีด SQL และการโจมตีเพื่อจัดการ URL
คำแนะนำ: เพื่อป้องกันการโจมตีดังกล่าว ให้ใช้กลยุทธ์การตรวจสอบความถูกต้องและการฆ่าเชื้อที่เหมาะสม ใช้คำค้นหาที่กำหนดพารามิเตอร์หรือคำสั่งที่เตรียมไว้ เป็นต้น และตรวจสอบให้แน่ใจว่าค่าที่ผู้ใช้ระบุใน URL ได้รับการเข้ารหัสอย่างถูกต้อง
4. การจัดเก็บรหัสผ่านที่ปลอดภัย: สิ่งสำคัญคือต้องจำไว้ว่าการเก็บรหัสผ่านในรูปแบบข้อความธรรมดานั้นไม่ปลอดภัยหากฟังก์ชันนี้เป็นส่วนประกอบของรูปแบบการตรวจสอบสิทธิ์ที่ใหญ่กว่า ก่อนจัดเก็บ รหัสผ่านควรได้รับการแฮชและใส่เกลืออย่างปลอดภัยเพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาตในกรณีที่เกิดการละเมิดข้อมูล
คำแนะนำ: ใช้วิธีการแฮชรหัสผ่านที่ทรงพลังเพื่อจัดเก็บและตรวจสอบรหัสผ่านอย่างปลอดภัย เช่น bcrypt หรือ Argon2
โซลูชันที่ได้มาตรฐาน:
func connect() {
user := getEncryptedUser()
password:= getEncryptedPass() // Compliant
url := "login=" + user + "&passwd=" + password
}
- จัดเก็บข้อมูลรับรองในไฟล์การกำหนดค่าที่ไม่ได้พุชไปยังที่เก็บโค้ด
- เก็บข้อมูลรับรองในฐานข้อมูล
- ใช้บริการของผู้ให้บริการคลาวด์เพื่อจัดการความลับ
- หากมีการเปิดเผยรหัสผ่านผ่านซอร์สโค้ด: เปลี่ยนรหัสผ่าน
การจัดเก็บข้อมูลที่ละเอียดอ่อน เช่น รหัสผ่าน โดยตรงในซอร์สโค้ดจะทำให้ระบบเข้าถึงโดยไม่ได้รับอนุญาตและอาจถูกโจมตีได้
ทวิตเตอร์