Apakah penggunaan persyaratan keamanan dalam pandangan pelanggaran MVC?

10

Seringkali apa yang ditampilkan kepada pengguna (misalnya pada halaman web) sebagian didasarkan pada pemeriksaan keamanan. Saya biasanya menganggap keamanan tingkat pengguna / ACL sebagai bagian dari logika bisnis suatu sistem. Jika tampilan secara eksplisit memeriksa keamanan untuk menampilkan elemen UI secara kondisional, apakah itu melanggar MVC dengan mengandung logika bisnis?

Matt S
sumber
Apa alternatifnya?
1
Anda menggunakan apa yang memberi Anda keamanan terbaik bahkan jika itu dianggap anti-pola oleh beberapa orang.
zxcdw

Jawaban:

6

Ada dua jenis persyaratan keamanan, satu pada model dan satu lagi pada tampilan. Tampilan mengontrol tampilan elemen yang relevan tergantung pada izin pengguna saat ini, tetapi model mengontrol akses ke data yang mendasarinya. Selama model memiliki semua verifikasi / validasi yang tepat, maka bahkan jika tampilan kurang, masih ada keamanan.

Biasanya Anda harus memiliki keduanya, karena tampilan perlu diubah untuk berbagai level / peran. Pengontrol mengirimkan data yang relevan yang akan mengubah tampilan, tetapi tampilan masih perlu melakukan sesuatu dengan data itu untuk menyembunyikan / menampilkan konten ke pengguna yang tepat.

Itulah sebabnya sebagian besar kerangka kerja templating memiliki elemen bersyarat ( contoh Setang ):

{{#if isCurrentUserAdmin}}
    ....
{{/if}

Jadi itu berarti itu bukan pelanggaran, asalkan potongan yang sesuai berada di tempat yang benar.

diketahuiasilya
sumber
4

Iya dan tidak.

Jika keputusan keamanan yang sebenarnya dibuat oleh pandangan, maka ya, Anda melanggar MVC. Namun, jika tampilan mendelegasikan keputusan aktual untuk model, maka Anda baik-baik saja. Tidak ada yang salah dengan pandangan membuat keputusan tentang elemen mana yang akan ditampilkan, berdasarkan informasi dari model.

Misalnya, jika Anda memiliki tombol "edit" yang hanya dapat dilihat oleh pengguna dengan izin "editor", maka tidak apa-apa bagi pandangan untuk menanyakan model siapa pengguna saat ini dan apakah mereka memiliki izin "editor", lalu menggunakan informasi ini untuk memutuskan apakah akan menampilkan tombol atau tidak. Namun, jika pandangan itu untuk melakukan logika otentikasi dan otorisasi itu sendiri, maka Anda akan melanggar MVC.

tammmer
sumber
2

Saya akan mengatakan tidak .

Tetapi untuk alasan yang berbeda dari @rvcoutinho berkata (meskipun dia mengutip wikipedia yang membuat saya merasa salah dalam pemikiran saya)

Saya akan mengatakan masalah keamanan yang relevan harus dibagikan oleh Model yang diberikan kepada tampilan (tergantung pada jumlah kombinasi Anda mungkin ingin menggunakan ViewModel untuk alasan ini), di mana Anda bisa memiliki sakelar untuk bit keamanan.

Hal ini memungkinkan validasi keamanan dua lapisan: pada lapisan UI sehingga postback ditumbangkan untuk kasus normal, serta pada lapisan server untuk aktor jahat di mana model mempertahankan pengetahuan keamanan di dalam dirinya sendiri sehingga pengontrol menyerahkan info ke model yang segera membuangnya.

Keamanan dua lapis seperti ini adalah standar dalam industri, dan cara ini memungkinkan logika keamanan Anda hanya perlu ada di dua tempat jadi itu bonus, segera setelah Anda memasukkan logika keamanan di controller Anda, Anda meletakkannya di sana, dan di UI dan dalam model (model membutuhkannya karena ini adalah garis pertahanan terakhir dan terutama penting untuk penggunaan di luar aplikasi web MVC seperti klien desktop atau alat manajemen server apa pun)

Jimmy Hoffa
sumber
Pernyataan Wikipedia bahwa "Pengontrol dapat mengirim perintah ke tampilan terkait untuk mengubah tampilan presentasi model" tampaknya lebih cocok untuk Model-View-Presenter , karena model interaktif yang tampaknya dijelaskan di dalam kalimat itu mungkin, sedangkan di MVC, sekali View diberikan, tidak ada tindakan lebih lanjut yang terjadi antara View dan Controller.
Robert Harvey
1
@RobertHarvey Saya setuju bahwa pernyataan tersebut tidak sesuai dengan definisi saya tentang MVC, tetapi beruntungnya kami bekerja di industri di mana kebenaran diputuskan oleh pluralitas perjanjian daripada provabilitas apa pun karena definisi ini hanya mengambang seolah-olah dari eter dengan sebuah yayasan yang terus berkembang memungkinkan setiap orang untuk membuat takeaways mereka sendiri. Atau dengan kata-kata yang lebih jelas, saya mungkin salah sama seperti orang lain di sini.
Jimmy Hoffa
3
Itulah sebabnya saya pikir orang terlalu jago tentang hal semacam ini.
Robert Harvey
1
@rvcoutinho Saya tidak akan mengatakan itu sama sekali, saya menjadi harfiah; Anda punya referensi di pihak Anda, yang saya dapatkan hanyalah pendapat saya, jadi dalam pikiran saya itu berarti saya kemungkinan besar yang mengapa saya sebutkan. Saya merasa pendapat saya cukup masuk akal untuk dibagikan walaupun saya tidak punya referensi jadi saya tetap melakukannya, terlepas dari kenyataan bahwa seperti yang saya katakan, saya kemungkinan besar salah.
Jimmy Hoffa
1
@rvcoutinho: Sebenarnya, saya merujuk pada pertanyaan OP. :) Tidak ada yang salah dengan aturan, kecuali aturan menghalangi cara untuk menyelesaikan sesuatu.
Robert Harvey
2

Saya akan mengatakan tidak .

Biasanya, pemeriksaan keamanan semacam ini akan dilakukan oleh pengontrol.

Dari Wikipedia :

Pengontrol dapat mengirim perintah ke tampilan terkait untuk mengubah tampilan presentasi model

Dan saya tidak berpikir itu harus dilakukan secara langsung di tampilan. Jika itu dilakukan melalui javascript, misalnya, itu bisa menjadi masalah keamanan (orang bisa menonaktifkan javascript dan mengakses data privilleged).

Lagi, dari Wikipedia :

Tampilan meminta dari model informasi yang dibutuhkan untuk menghasilkan representasi output .

rvcoutinho
sumber
1
Dalam banyak sistem perangkat lunak, tampilan elemen tergantung pada tingkat keamanan pengguna. Meskipun Anda bisa menghambat tampilan item data dengan mengaturnya ke nol atau nol di Model Tampilan, nama atau deskripsi item data akan tetap ditampilkan. Satu-satunya tempat di mana Anda dapat menghambat tampilan deskripsi item data (secara praktis) adalah di View.
Robert Harvey
Saya cenderung tidak setuju. Saya akan mengatakan view akan meminta data, controller akan memanipulasi model, dan view akan, sekali lagi, mewakilinya. Pandangan harus bertanggung jawab atas representasi output saja.
rvcoutinho
Itulah sebabnya View perlu menyembunyikan elemen visual yang tidak perlu dilihat pengguna. Pengendali tidak bertanggung jawab untuk membuat representasi visual dari data; Lihat adalah. Tentu saja, jika apa yang Anda tampilkan sangat sensitif sehingga bahkan tidak bisa di View / Source, maka apa yang perlu dilakukan pengontrol adalah mengembalikan tampilan yang berbeda .
Robert Harvey
1
Itu poin saya. Tampilannya harus berbeda. Sejauh yang saya mengerti, sepertinya tampilan hanya harus menjaga representasi data. Dengan representasi, yang saya maksud adalah bagaimana menunjukkan sesuatu, bukan kapan harus menunjukkannya. Namun komentar Anda sepenuhnya relevan.
rvcoutinho
Yah, saya pikir kita mungkin hanya menggunakan ekspresi yang sama untuk dua hal yang berbeda. Apa sih pandangan yang berbeda? Tapi saya pikir kita sepakat tentang hal yang paling penting: jika itu sensitif terhadap keamanan, itu tidak boleh ditangani oleh pandangan.
rvcoutinho
1

Ada beberapa masalah yang terlibat dalam pertanyaan ini.

  1. Otentikasi (adalah pengguna ini yang menurutnya adalah dirinya) tidak boleh menjadi perhatian dari View.
  2. Otorisasi (Apakah pengguna saat ini diizinkan untuk melakukan ini ) adalah masalah Tampilan, karena hal itu dapat memengaruhi apa yang disajikan kepada pengguna. Dengan demikian, kode untuk menampilkan tombol edit dapat dikelilingi dengan suka bersyarat if model.userCanEdit() ... endif.
  3. Penentuan atribut otorisasi mana yang dimiliki pengguna, yaitu logika bisnis dan harus ditempatkan dalam Model. (Misalnya, hak istimewa 'edit' mengharuskan Anda memiliki 2000 reputasi; atau Anda harus menjadi penulis atau moderator)
Bart van Ingen Schenau
sumber
0

Jika hanya tentang menampilkan elemen UI, saya pikir tidak apa-apa (bagaimana lagi yang akan Anda lakukan?). Jika ada data dalam elemen-elemen itu, model harus memastikan bahwa wadahnya kosong. Dan tentu saja kode untuk mendapatkan data izin seharusnya sudah ditangani sebelum tampilan, jadi tidak ada akses aktif ke model di sini.

thorsten müller
sumber
0

Jika tampilan secara eksplisit memeriksa keamanan untuk menampilkan elemen UI secara kondisional, apakah itu melanggar MVC dengan mengandung logika bisnis?

Ya, ini merupakan pelanggaran MVC.

Tampilan ada hanya untuk menampilkan elemen, dan logikanya harus dalam model. Dengan memiliki pandangan melakukan sesuatu (dalam kasus Anda, periksa keamanan), Anda menempatkan logika di sana.

BЈовић
sumber
Lalu bagaimana pandangan tahu apakah menampilkan sesuatu seperti tombol edit atau tidak?
Matt S
@MattS Presenter memanggil fungsi dalam tampilan untuk menampilkan atau menyembunyikan tombol itu (tergantung pada keadaan dalam model).
BЈовић