การตรวจสอบการป้อนข้อมูลเป็นเรื่องยากสำหรับฉัน
ในการเพิ่มกรอบความปลอดภัยและรหัสจริงลงในโครงการเขียนแอปพลิเคชันดั้งเดิมของเรา (ซึ่งตอนนี้ค่อนข้างจะรักษารหัสรักษาความปลอดภัยดั้งเดิมและการตรวจสอบความถูกต้องของข้อมูล) ฉันสงสัยอีกครั้งว่าควรจะตรวจสอบมากแค่ไหน ที่ไหน ฯลฯ
ตลอด 5 ปีที่ฉันเป็นนักพัฒนา Java มืออาชีพฉันได้สร้างและปรับปรุงกฎส่วนบุคคลของฉันสำหรับการตรวจสอบความถูกต้องของข้อมูลและมาตรการรักษาความปลอดภัย เมื่อฉันต้องการปรับปรุงวิธีการของฉันฉันอยากได้ยินความคิดเห็นจากพวกคุณ กฎและโพรซีเดอร์ทั่วไปนั้นใช้ได้ดีและจาวาเฉพาะก็เช่นกัน
สรุปนี่คือแนวทางของฉัน (เปิดเผยในรูปแบบเว็บแอปพลิเคชัน 3 ระดับ) พร้อมคำอธิบายสั้น ๆ :
ฝั่งไคลเอ็นต์ชั้นที่ 1 (เบราว์เซอร์): การตรวจสอบความถูกต้องน้อยที่สุด, กฎที่ไม่เปลี่ยนแปลงเท่านั้น (ฟิลด์อีเมลบังคับ, ต้องเลือกหนึ่งรายการ, และอื่น ๆ ที่คล้ายกัน); การใช้การตรวจสอบเพิ่มเติมเช่น "ระหว่าง 6 ถึง 20 ตัวอักษร" น้อยลงเนื่องจากจะเป็นการเพิ่มการบำรุงรักษาในการเปลี่ยนแปลง (อาจเพิ่มเมื่อรหัสธุรกิจมีเสถียรภาพ);
ฝั่งเซิร์ฟเวอร์ระดับที่ 1 (การจัดการการสื่อสารผ่านเว็บ "ตัวควบคุม"): ฉันไม่มีกฎสำหรับอันนี้ แต่ฉันเชื่อว่าควรจัดการเฉพาะการจัดการข้อมูลและข้อผิดพลาดการประกอบ / การแยกวิเคราะห์ที่นี่ (ฟิลด์วันเกิดไม่ใช่วันที่ที่ถูกต้อง) การเพิ่มการตรวจสอบเพิ่มเติมที่นี่ทำให้กระบวนการนั้นน่าเบื่อจริงๆ
ชั้นที่ 2 (ชั้นธุรกิจ): การรับรองความถูกต้องที่แข็งแกร่งของหินไม่น้อยกว่า; รูปแบบข้อมูลอินพุต, ช่วง, ค่า, การตรวจสอบสถานะภายในหากวิธีการไม่สามารถเรียกได้ทุกเวลา, บทบาท / สิทธิ์ของผู้ใช้และอื่น ๆ ; ใช้ข้อมูลอินพุตของผู้ใช้เพียงเล็กน้อยเท่าที่จะทำได้ดึงข้อมูลอีกครั้งจากฐานข้อมูลหากจำเป็น ถ้าเราพิจารณาดึงข้อมูลฐานข้อมูลเป็นอินพุตด้วยฉันจะตรวจสอบเฉพาะถ้าข้อมูลบางอย่างไม่น่าเชื่อถือหรือเสียหายเพียงพอในฐานข้อมูล - การพิมพ์ที่รัดกุมทำให้งานส่วนใหญ่ที่นี่ IMHO;
ชั้นที่ 3 (ชั้นข้อมูล / DAL / DAO): ไม่เคยเชื่อว่าจำเป็นต้องมีการตรวจสอบความถูกต้องเนื่องจากชั้นธุรกิจเท่านั้นที่ควรเข้าถึงข้อมูล (ตรวจสอบความถูกต้องในบางกรณีเช่น "param2 ต้องไม่เป็นโมฆะถ้า param1 เป็นจริง") โปรดสังเกตว่าเมื่อฉันหมายถึง "ที่นี่" ฉันหมายถึง "รหัสที่เข้าถึงฐานข้อมูล" หรือ "วิธีการประมวลผล SQL" ฐานข้อมูลนั้นตรงกันข้ามอย่างสมบูรณ์;
ฐานข้อมูล (ตัวแบบข้อมูล): ต้องมีความคิดที่ดีมีความแข็งแรงและบังคับใช้เองเพื่อหลีกเลี่ยงข้อมูลที่ไม่ถูกต้องและเสียหายในฐานข้อมูลให้มากที่สุดเท่าที่จะเป็นไปได้ด้วยคีย์หลักที่ดีคีย์ต่างประเทศข้อ จำกัด ประเภทข้อมูล / ความยาว / ขนาด / แม่นยำเป็นต้น - ฉันปล่อยให้สิ่งกระตุ้นเกิดขึ้นเพราะพวกเขามีการพูดคุยส่วนตัว
ฉันรู้ว่าการตรวจสอบความถูกต้องของข้อมูลในช่วงแรกนั้นดีและมีประสิทธิภาพ แต่การตรวจสอบความถูกต้องของข้อมูลเป็นกระบวนการที่น่าเบื่อและฉันยอมรับว่าการตรวจสอบความถูกต้องของข้อมูลนั้นค่อนข้างน่ารำคาญ นั่นเป็นสาเหตุที่โคเดอร์จำนวนมากข้ามไปหรือทำครึ่งทาง นอกจากนี้การตรวจสอบซ้ำทุกครั้งจะเป็นข้อผิดพลาดที่เป็นไปได้หากไม่มีการซิงโครไนซ์ตลอดเวลา นี่คือเหตุผลหลักที่ปัจจุบันฉันเลือกที่จะให้การตรวจสอบส่วนใหญ่ขึ้นอยู่กับเลเยอร์ธุรกิจโดยเสียเวลาแบนด์วิดท์และ CPU ยกเว้นการจัดการเป็นกรณีไป
แล้วคุณคิดอย่างไรเกี่ยวกับเรื่องนี้? ตรงข้ามกับความคิดเห็น? คุณมีวิธีการอื่นหรือไม่? การอ้างอิงถึงหัวข้อดังกล่าว? ผลงานใด ๆ ที่ถูกต้อง
หมายเหตุ: หากคุณกำลังคิดวิธีการทำ Java แอปของเราคือ Spring โดยใช้ Spring MVC และ MyBatis (ประสิทธิภาพและรูปแบบฐานข้อมูลที่ไม่ดีออกกฎ ORM) ฉันวางแผนที่จะเพิ่ม Spring Security เป็นผู้ให้บริการด้านความปลอดภัยของเราบวก JSR 303 (Hibernate Validator?)
ขอบคุณ!
แก้ไข: ชี้แจงพิเศษบางอย่างในชั้นที่ 3