Validasi input data selalu merupakan perjuangan internal bagi saya.
Di ambang menambahkan kerangka kerja dan kode keamanan nyata ke proyek penulisan ulang aplikasi lawas kami (yang sejauh ini cukup banyak menyimpan kode keamanan warisan-kartu yang kuat dan validasi data), saya bertanya-tanya lagi tentang berapa banyak yang harus saya validasikan, dimana, dll.
Selama 5 tahun saya sebagai pengembang Java profesional, saya membuat dan menyempurnakan aturan pribadi saya untuk validasi input data dan langkah-langkah keamanan. Karena saya ingin meningkatkan metode saya, saya ingin mendengar beberapa ide dari kalian. Aturan dan prosedur umum baik-baik saja, dan yang khusus Java juga.
Ringkasnya, ini adalah pedoman saya (terbuka pada gaya aplikasi web 3-tier), dengan penjelasan singkat:
Sisi klien tingkat pertama (browser): validasi minimal, hanya aturan yang tidak berubah-ubah (bidang email wajib, harus memilih satu item, dan sejenisnya); penggunaan validasi tambahan seperti "antara 6 dan 20 karakter" lebih jarang, karena ini meningkatkan pekerjaan pemeliharaan pada perubahan (dapat ditambahkan setelah kode bisnis stabil);
Sisi server tingkat 1 (penanganan komunikasi web, "pengontrol"): Saya tidak memiliki aturan untuk yang ini, tetapi saya percaya hanya manipulasi data dan kesalahan perakitan / penguraian yang harus ditangani di sini (bidang ulang tahun bukan tanggal yang valid); menambahkan validasi lebih lanjut di sini dengan mudah membuatnya menjadi proses yang sangat membosankan;
2nd tier (lapisan bisnis): validasi solid, tidak kurang; input format data, rentang, nilai, pemeriksaan keadaan internal jika metode tidak dapat dipanggil kapan saja, peran / izin pengguna, dan sebagainya; gunakan sesedikit mungkin input data pengguna, ambil kembali dari database jika diperlukan; jika kita mempertimbangkan mengambil data basis data sebagai input juga, saya hanya akan memvalidasinya jika beberapa data spesifik diketahui tidak cukup dapat diandalkan atau rusak pada DB - pengetikan yang kuat melakukan sebagian besar pekerjaan di sini, IMHO;
Tingkat 3 (lapisan data / DAL / DAO): tidak pernah percaya banyak validasi diperlukan di sini, karena hanya lapisan bisnis yang seharusnya mengakses data (validasi mungkin pada beberapa kasus seperti "param2 tidak boleh nol jika param1 benar"); Namun perhatikan, bahwa ketika saya maksudkan "di sini" maksud saya "kode yang mengakses database" atau "metode pelaksana SQL", database itu sendiri benar-benar kebalikannya;
database (model data): perlu dipikirkan dengan baik, kuat dan dapat diterapkan sendiri untuk menghindari data yang salah dan korup pada DB sebanyak mungkin, dengan kunci primer yang baik, kunci asing, kendala, tipe data / panjang / ukuran / presisi dan sebagainya - Saya akan meninggalkan pemicu ini, karena mereka memiliki diskusi pribadi mereka sendiri.
Saya tahu validasi data awal itu bagus dan dari segi kinerja, tetapi validasi data berulang adalah proses yang membosankan, dan saya akui bahwa validasi data itu sendiri cukup menjengkelkan. Itu sebabnya begitu banyak coders melewatkannya atau melakukannya di tengah jalan. Selain itu, setiap validasi duplikat adalah bug yang mungkin terjadi jika tidak disinkronkan setiap saat. Itulah alasan utama saya saat ini lebih suka membiarkan sebagian besar validasi naik ke lapisan bisnis, dengan mengorbankan waktu, bandwidth dan CPU, pengecualian ditangani berdasarkan kasus per kasus.
Jadi, apa pendapat Anda tentang ini? Opini yang berlawanan? Apakah Anda memiliki prosedur lain? Referensi ke topik seperti itu? Setiap kontribusi adalah valid.
Catatan: jika Anda memikirkan cara Java untuk melakukan sesuatu, aplikasi kami berbasis pada Spring MVC dan MyBatis (kinerja dan model basis data yang buruk mengesampingkan solusi ORM); Saya berencana untuk menambahkan Spring Security sebagai penyedia keamanan kami ditambah JSR 303 (Hibernate Validator?)
Terima kasih!
Sunting: beberapa klarifikasi tambahan pada layer ke-3.