Saya membuat aplikasi web strcutured API dan dalam aplikasi ini kami memiliki berbagai lapisan yang melakukan pekerjaan mereka sendiri.
Lapisan pertama adalah lapisan Validasi yang memvalidasi input pengguna dan jika melewati validasi, kami memindahkannya ke lapisan kedua (yang merupakan lapisan Access Control ) jika tidak mengembalikan pesan kesalahan
Lapisan kedua adalah Kontrol Akses yang memeriksa apakah pengguna memiliki izin untuk melakukan tugas yang ingin dilakukan, Jika pengguna memiliki izin itu memindahkan permintaan ke lapisan berikutnya jika tidak mengembalikan pesan kesalahan
Lapisan Ketiga adalah Lapisan Pengendali di mana kita memiliki logika aplikasi
Pertanyaan saya adalah apakah boleh memiliki lapisan validasi sebelum kontrol akses? Bagaimana jika pengguna mencoba melakukan tugas yang tidak diizinkan oleh pengguna dan kami mengirim kembali pesan kesalahan validasi? Pengguna akan mengirim permintaan ke titik akhir dan berbicara dengan lapisan validasi dan setelah melewati validasi hanya kemudian ia akan melihat pesanYou can't access this!
Rasanya aneh bagi saya sehingga tidak masalah seperti ini atau apa yang bisa menjadi pilihan saya yang lain dalam infrastruktur ini?
sumber
Jawaban:
Itu tergantung pada apakah mengetahui validitas beberapa input untuk tugas yang tidak diizinkan Anda lakukan adalah kebocoran keamanan. Jika ya, Anda harus melakukannya dengan cara sebaliknya.
Satu-satunya respons yang aman untuk pengguna yang tidak sah adalah "akses ditolak". Jika terkadang responsnya adalah "permintaan buruk" dan terkadang "akses ditolak", Anda mengirim informasi ke pengguna yang tidak sah.
Sebagai contoh, Anda dapat melakukan pemeriksaan validasi tugas "hapus dokumen" yang ada di dokumen yang disebutkan. Seseorang tanpa izin akan dapat melihat apakah ada sesuatu dengan mencoba menghapusnya, dan membandingkan kesalahan mana yang mereka terima kembali. Penyerang yang bertekad kuat dapat menyebutkan semua nama dokumen (di bawah panjang tertentu), untuk melihat yang ada.
sumber
Ya, ada beberapa jenis validasi:
Pengecekan kewarasan dasar murah, yang memverifikasi bahwa permintaan tidak jelas cacat.
Ini biasanya setidaknya sisi klien diduplikasi sebagian, untuk menghindari pulang pergi yang sia-sia.
Bagaimanapun, itu harus dilakukan sebelum akses-kontrol untuk membuat hal-hal lebih mudah dan lebih rentan kesalahan, karena tidak berisiko kebocoran informasi.
Validasi lebih mahal yang masih tidak bergantung pada data-aplikasi yang dilindungi.
Jika ada validasi ekstra seperti itu, mungkin setelah kontrol akses tidak untuk menghindari kebocoran data, tetapi untuk menghambat serangan DOS.
Kadang-kadang hanya menjalankan permintaan melakukan beberapa validasi itu secara implisit dengan pengurangan atau tanpa biaya, sehingga mungkin ditinggalkan di sini.
Jika semua validasi dari langkah pertama digandakan, mungkin masuk akal juga untuk menggandakan bagian sisi klien ini.
Validasi tambahan tergantung pada data-aplikasi yang dilindungi.
Melakukannya sebelum akses-kontrol jelas berisiko kebocoran informasi. Maka, pertama lakukan akses-kontrol.
sumber
Harus ada beberapa validasi sebelum kontrol akses. Misalkan API SO memiliki titik akhir "edit jawaban", lalu apakah pengguna dapat mengedit jawaban tertentu dapat bergantung pada jawabannya (di bawah reputasi tertentu, pengguna hanya dapat mengedit jawaban sendiri). Jadi parameter "ID jawaban" yang dibentuk dengan baik harus diverifikasi sebelum lapisan kontrol akses berperan; mungkin juga jawabannya ada.
OTOH, seperti yang disebutkan Caleth dan Greg, menempatkan validasi yang lebih luas sebelum kontrol akses merupakan risiko keamanan potensial.
Jadi aturan sulitnya
Mengikuti kedua aturan ini dapat berarti bahwa Anda harus memiliki beberapa validasi sebelum dan beberapa setelah kontrol akses.
sumber
Selain kemungkinan frustrasi menerima 'akses ditolak' setelah memvalidasi input; juga perlu diingat bahwa lapisan Validasi , kecuali yang sangat sederhana, selalu dapat membutuhkan informasi dari Controller . Dengan mengingat hal ini, saya yakin posisi Validasi di belakang Access Control , lebih dekat ke Controller lebih masuk akal.
sumber
Itu tergantung pada apa yang Anda maksud dengan lapisan validasi - jika maksudnya Anda hanya memeriksa sintaks dari permintaan, itu aman dan sesuatu yang harus Anda lakukan pula. Jika 'validasi' Anda menggunakan informasi apa pun yang tidak dapat diakses oleh pengguna yang tidak memiliki hak pribadi, itu tidak lagi aman.
Anda harus memiliki pemeriksa kewarasan sebelum mencoba kontrol akses, tetapi Anda harus berhati-hati untuk berkomunikasi dengan sangat jelas kepada semua pengelola (saat ini dan di masa depan) bahwa bagian ini tidak boleh menggunakan informasi istimewa; Setiap pemeriksaan semacam itu harus dilakukan dalam langkah validasi terpisah setelah otentikasi.
Sebagai pemeriksaan kewarasan untuk pemeriksa kewarasan, seharusnya tidak benar-benar memiliki dependensi kode pada bagian mana pun dari kode Anda turunkan pipa dan harus dipisahkan ke dalam paket sendiri yang harus dipublikasikan untuk umum tanpa masalah (selain masalah hukum yang mungkin terjadi) . Jika Anda tidak bisa melakukan itu, 'lapisan validasi' Anda melakukan terlalu banyak (atau basis kode Anda berantakan).
sumber
Tidak. Itu tidak baik.
Jika Anda memiliki bug di lapisan validasi Anda, itu mungkin memotong lapisan keamanan.
Merupakan kesalahan umum untuk mempertimbangkan keamanan sebagai bagian dari persyaratan bisnis. "hanya pengguna dengan peran penjualan, yang dapat melihat angka-angka kuartalan" seperti aturan bisnis.
Tetapi jika Anda ingin aman, Anda harus membaca aturan seperti "hanya pengguna dalam peran penjualan, harus dapat menjalankan kode pada titik akhir ini" Anda harus memastikan server Anda selalu mengembalikan "akses ditolak" sebelum sampai ke segala jenis kode yang Anda tulis atau file di server.
sumber