บัฟเฟอร์มากเกินไปนั้นใหญ่เกินไป ไม่มีสิ่งใดใน C ที่ตรวจสอบช่วงโดยค่าเริ่มต้นดังนั้นจึงเป็นเรื่องง่ายมากที่จะเขียนทับบัฟเฟอร์ มีฟังก์ชั่นไลบรารีมาตรฐานgets()
ที่ไม่สามารถหยุดการโอเวอร์โฟลว์บัฟเฟอร์และไม่ควรใช้
มีเทคนิคระดับการนำไปปฏิบัติบางอย่างเพื่อขัดขวางการใช้ประโยชน์เช่น scrambling heap blocks แต่จะไม่หยุดบัฟเฟอร์ล้นในบัฟเฟอร์ในเครื่องซึ่งมักจะทำสิ่งที่น่าสนใจเช่นเปลี่ยนที่อยู่ที่ฟังก์ชันจะกลับไป
ไม่มีวิธีแก้ปัญหาทั่วไปที่ดีใน C. ฟังก์ชั่นห้องสมุดหลายแห่งมีรุ่นที่จะ จำกัด จำนวนเงินที่พวกเขาจะเขียน แม้ว่าการคำนวณที่สามารถเงอะงะ มีซอฟต์แวร์ที่สามารถตรวจจับฮีปบัฟเฟอร์ล้นในการทดสอบตราบใดที่มีการทดสอบที่เหมาะสมและสแต็กโอเวอร์โฟลว์มักจะปรากฏเป็นความผิดพลาดในการทดสอบ นอกเหนือจากนั้นมันเป็นเรื่องของการเข้ารหัสและการตรวจสอบรหัสอย่างระมัดระวัง
ปัญหาที่เกี่ยวข้องคือปัญหาของการเขียนลงในบัฟเฟอร์เล็กเกินไปโดยตัวละครตัวหนึ่งลืมว่าสตริง C ที่มีความยาว n ตัวต้องใช้ตัวอักษร n + 1 ในหน่วยความจำเนื่องจากตัว'\0'
ยุติ หากผู้โจมตีสามารถจัดการเก็บสตริงโดยไม่ต้องใช้เทอร์มินัลฟังก์ชัน C ใด ๆ ที่คาดว่าสตริงจะดำเนินการต่อไปจนกว่าจะถึงศูนย์ไบต์ซึ่งอาจส่งผลให้คัดลอกหรือส่งออกข้อมูลมากกว่าที่ต้องการ (หรือกดปุ่มหน่วยความจำ ) การแก้ปัญหาอีกครั้งคือการรับรู้การดูแลและการตรวจสอบรหัส
มีความเสี่ยงอีกอย่างกับprintf()
ครอบครัว หากคุณเคยเขียนchar * str; ... printf(str);
คุณกำลังตั้งค่าตัวเองสำหรับปัญหาหากstr
มี '%' เมื่อพิมพ์ %n
สั่งรูปแบบช่วยให้printf()
การเขียนในหน่วยความจำ การแก้ปัญหาคือหรือprintf("%s", str);
puts(str);
(นอกจากนี้ให้ใช้ C99 snprintf()
แทนsprintf()
)
การใช้จำนวนเต็มที่ไม่ได้ลงนามโดยเฉพาะดัชนีลูปอาจทำให้เกิดปัญหาได้ หากคุณกำหนดค่าลบเล็กน้อยให้แก่ผู้ที่ไม่ได้ลงชื่อคุณจะได้รับค่าบวกจำนวนมาก ที่สามารถทำลายสิ่งที่ต้องการการประมวลผลเพียง N กรณีของบางสิ่งบางอย่างหรือในฟังก์ชั่น จำกัด strncpy()
เช่น ตรวจสอบจำนวนเต็มที่ไม่ได้ลงนามทั้งหมด คุณอาจต้องการที่จะหลีกเลี่ยงเนื่องจากค่าขนาดใหญ่หนึ่งในผู้ที่จะแปลงเป็นค่าบวกขนาดใหญ่ในunsigned short
int
int
อย่าลืมว่าค่าคงที่ตัวละครในซีเป็นจริง เขียนสิ่งที่ต้องการchar c; while((c = getchar()) != EOF) ...
ได้อย่างง่ายดายสามารถล้มเหลวเนื่องจากจะไม่สามารถแทนได้ในEOF
char
มีข้อผิดพลาดลักษณะ C มากกว่าที่ฉันคิดได้ แต่สิ่งเหล่านี้อาจทำให้เกิดปัญหาด้านความปลอดภัย