ข้อสันนิษฐานของคุณเกี่ยวกับรหัสว่าเป็นความปลอดภัยรั่วอาจหรืออาจไม่เป็นจริงขึ้นอยู่กับภาษาที่คุณใช้ ในรหัส C มันอาจเป็นปัญหา (โดยเฉพาะอย่างยิ่งเพราะใน C บูลีนเป็นเพียง int ที่ไม่ใช่ศูนย์หรือศูนย์) - แต่ในภาษาที่พิมพ์อย่างรุนแรงที่สุด (เช่นการตรวจสอบประเภทรันไทม์) ถ้าpasswordCheck
ตัวแปรถูกประกาศเป็นบูลีน ไม่มีทางที่จะมอบหมายอย่างอื่นให้กับมันได้ ในความเป็นจริงทุกอย่างในเพรดิเคตif
ต้องแก้ไขเป็นบูลีนไม่ว่าคุณจะใช้โอเปอเรเตอร์บูลีนหรือเพียงแค่ใช้ค่า หากคุณจัดการให้มีวัตถุประเภทอื่นที่ถูกผูกไว้กับpasswordCheck
รันไทม์จะทำให้เกิดข้อยกเว้นที่ผิดกฎหมายบางประเภท
ง่ายถ้า / อื่นสร้างจะง่ายต่อการอ่านมากกว่าถ้า / ถ้าสร้าง - และมีแนวโน้มที่จะเกิดปัญหาโดยไม่ตั้งใจน้อยลงถ้ามีคนพยายามที่จะพลิกโครงสร้าง ลองทำตัวอย่างเดียวกันเป็นวินาที
if(passwordCheck == false) {
denyAccess();
}
if(passwordCheck) {
letThemIn();
}
ความหมายของประโยคพิเศษร่วมกันที่คุณต้องการดำเนินการข้างต้นจะหายไป นั่นคือสิ่งที่ถ้า / อื่นสร้างสื่อถึง มีการดำเนินการสองสาขาที่ไม่เกิดร่วมกันโดยที่หนึ่งในนั้นจะทำงานเสมอ นี่เป็นส่วนสำคัญของการรักษาความปลอดภัย - ทำให้มั่นใจletThemIn
ได้ว่าหลังจากคุณโทรมาdenyAccess
แล้ว
สำหรับจุดประสงค์ของความชัดเจนของรหัสและเพื่อให้มั่นใจว่าส่วนที่สำคัญได้รับความคุ้มครองมากที่สุดควรอยู่ในส่วนหลัก ( if
ส่วน) พฤติกรรมที่ไม่เป็นไปตามค่าเริ่มต้นควรอยู่ในข้ออื่น ( else
ส่วนหนึ่ง) ตัวอย่างเช่น:
if(passwordCheck) {
letThemIn();
} else {
denyAccess();
}
หมายเหตุ: ในการทำงานกับภาษาต่าง ๆ ฉันได้พัฒนา habbit เข้ารหัสที่ช่วยหลีกเลี่ยงคำถามที่ว่า "จะเกิดอะไรขึ้นถ้าเป็นสตริง" โดยพื้นฐานแล้วมันคือการใส่ค่าคงที่ก่อนในนิพจน์บูลีน ตัวอย่างเช่นแทนที่จะตรวจสอบpasswordCheck == false
false == passwordCheck
ผมตรวจสอบ นอกจากนี้ยังช่วยหลีกเลี่ยงปัญหาการมอบหมายโดยไม่ได้ตั้งใจใน C ++ ใช้วิธีนี้คอมไพเลอร์จะบ่นถ้าฉันพิมพ์แทน=
==
ในภาษาเช่น Java และ C # คอมไพเลอร์จะปฏิบัติต่อการมอบหมายในข้อถ้าเป็นข้อผิดพลาด แต่ C ++ จะยอมรับอย่างมีความสุข นั่นเป็นเหตุผลที่ฉันมักจะทำการตรวจสอบโมฆะกับnull
ครั้งแรก
หากคุณเปลี่ยนภาษาเป็นประจำการวางค่าคงที่ไว้ก่อนจะมีประโยชน์มาก อย่างไรก็ตามในทีมของฉันมันตรงข้ามกับมาตรฐานการเข้ารหัสและคอมไพเลอร์ก็จับปัญหาเหล่านั้นอยู่ดี มันอาจเป็นกระต่ายยากที่จะทำลาย