Việc sử dụng các điều kiện bảo mật theo quan điểm có vi phạm MVC không?


10

Thông thường những gì được hiển thị cho người dùng (ví dụ: trên trang web) sẽ dựa một phần vào kiểm tra bảo mật. Tôi thường coi bảo mật cấp độ người dùng / ACL là một phần của logic nghiệp vụ của một hệ thống. Nếu một khung nhìn kiểm tra rõ ràng bảo mật để hiển thị có điều kiện các thành phần UI, thì nó có vi phạm MVC bằng cách chứa logic nghiệp vụ không?


Điều gì sẽ là sự thay thế?

1
Bạn sử dụng những gì mang lại cho bạn sự bảo mật tốt nhất ngay cả khi một số người coi đó là mô hình chống đối.
zxcdw

Câu trả lời:


6

Có thể có hai loại điều kiện bảo mật, một loại trên mô hình và loại khác trên khung nhìn. Khung nhìn kiểm soát việc hiển thị các yếu tố liên quan tùy thuộc vào quyền của người dùng hiện tại, nhưng mô hình kiểm soát quyền truy cập vào dữ liệu cơ bản. Miễn là mô hình có tất cả các xác minh / xác nhận hợp lệ, thì ngay cả khi chế độ xem bị thiếu, vẫn có bảo mật.

Thông thường bạn phải có cả hai, vì chế độ xem cần thay đổi cho các cấp / vai trò khác nhau. Bộ điều khiển gửi dữ liệu liên quan sẽ thay đổi chế độ xem, nhưng chế độ xem vẫn cần phải làm gì đó với dữ liệu đó để ẩn / hiển thị nội dung cho đúng người dùng.

Đó là lý do tại sao hầu hết các khung khuôn mẫu đều có các yếu tố có điều kiện ( ví dụ về Tay cầm ):

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

Vì vậy, điều đó có nghĩa là đó không phải là vi phạm, miễn là các mảnh thích hợp ở đúng vị trí.


4

Có và không.

Nếu quyết định bảo mật thực tế được đưa ra bởi chế độ xem, thì có, bạn đang vi phạm MVC. Tuy nhiên, nếu khung nhìn ủy thác quyết định thực tế cho mô hình, thì bạn vẫn ổn. Không có gì sai với quan điểm đưa ra quyết định về yếu tố nào sẽ hiển thị, dựa trên thông tin từ mô hình.

Ví dụ: nếu bạn có nút "chỉnh sửa" chỉ hiển thị cho người dùng có quyền "trình chỉnh sửa", thì bạn có thể hỏi người mẫu hiện tại là ai và liệu họ có quyền "biên tập viên" hay không sử dụng thông tin này để quyết định có hiển thị nút hay không. Tuy nhiên, nếu chế độ xem là để thực hiện logic xác thực và ủy quyền, thì bạn sẽ vi phạm MVC.


2

Tôi sẽ nói không .

Nhưng vì một lý do khác với @rvcoutinho đã nói (mặc dù anh ấy trích dẫn wikipedia khiến tôi cảm thấy sai lầm trong suy nghĩ của mình)

Tôi muốn nói rằng bất kỳ mối quan tâm bảo mật nào có liên quan nên được chia sẻ bởi Mô hình được cung cấp cho chế độ xem (tùy thuộc vào số lượng kết hợp bạn có thể muốn sử dụng ViewModel vì lý do này), trong đó bạn có thể có các công tắc cho các bit bảo mật.

Điều này cho phép xác thực bảo mật hai lớp: ở lớp UI, do đó, một postback bị phá vỡ cho trường hợp bình thường, cũng như ở lớp máy chủ cho các tác nhân xấu trong đó mô hình duy trì kiến ​​thức bảo mật bên trong chính nó để bộ điều khiển đưa thông tin vào mô hình mà ngay lập tức ném nó ra.

Bảo mật hai lớp như thế này là tiêu chuẩn trong công nghiệp và cách này cho phép logic bảo mật của bạn chỉ cần tồn tại ở hai nơi vì vậy đó là phần thưởng, ngay khi bạn đặt logic bảo mật vào bộ điều khiển của mình, bạn sẽ đặt nó ở đó và trong Giao diện người dùng và trong mô hình (mô hình cần nó là dòng bảo vệ cuối cùng và đặc biệt quan trọng đối với mọi mục đích sử dụng bên ngoài ứng dụng web MVC đó như máy khách để bàn hoặc bất kỳ công cụ quản lý máy chủ nào)


Wikipedia khẳng định rằng "Bộ điều khiển có thể gửi các lệnh đến khung nhìn liên quan của nó để thay đổi cách trình bày mô hình của khung nhìn" có vẻ phù hợp hơn với Model-View-Presenter , vì mô hình tương tác mà cụm từ dường như có thể mô tả ở đó, trong khi ở MVC, một lần Chế độ xem được hiển thị, không có hành động nào nữa diễn ra giữa Chế độ xem và Bộ điều khiển.
Robert Harvey

1
@RobertHarvey Tôi đồng ý rằng tuyên bố đó không phù hợp với định nghĩa của tôi về MVC, nhưng may mắn là chúng tôi làm việc trong một ngành công nghiệp nơi sự đúng đắn được quyết định bởi nhiều thỏa thuận thay vì bất kỳ sự chứng minh nào vì những định nghĩa này chỉ nổi lên như thể từ ether với một nền tảng không ngừng phát triển cho phép tất cả mọi người thực hiện những bước đi của riêng họ. Hay nói một cách đơn giản hơn, có lẽ tôi cũng sai như mọi người khác ở đây.
Jimmy Hoffa

3
Đó là lý do tại sao tôi nghĩ rằng mọi người quá xa cách về loại điều này.
Robert Harvey

1
@rvcoutinho Tôi sẽ không nói điều đó, tôi đã được biết chữ; bạn đã có tài liệu tham khảo về phía bạn, tất cả những gì tôi có là ý kiến ​​của tôi, vì vậy trong đầu tôi có nghĩa là tôi có thể sai, đó là lý do tại sao tôi đề cập đến nó. Tôi cảm thấy ý kiến ​​của mình đủ hợp lý để đáng để chia sẻ mặc dù tôi không có tài liệu tham khảo nên dù sao tôi cũng đã làm điều đó, bất kể thực tế như tôi đã nói, tôi có thể sai.
Jimmy Hoffa

1
@rvcoutinho: Thật ra, tôi đã đề cập đến câu hỏi của OP. :) Không có gì sai với các quy tắc, trừ khi các quy tắc cản trở việc hoàn thành một cái gì đó.
Robert Harvey

2

Tôi sẽ nói không .

Thông thường, loại kiểm tra bảo mật này sẽ được thực hiện bởi bộ điều khiển.

Như từ Wikipedia :

Một bộ điều khiển có thể gửi các lệnh đến khung nhìn liên quan của nó để thay đổi cách trình bày mô hình của khung nhìn

Và tôi không nghĩ rằng nó nên được thực hiện trực tiếp trong chế độ xem. Ví dụ, nếu nó được thực hiện thông qua javascript, thì đó có thể là một vấn đề bảo mật (người ta có thể vô hiệu hóa javascript và truy cập dữ liệu riêng tư).

Một lần nữa, từ Wikipedia :

Một khung nhìn yêu cầu từ mô hình thông tin mà nó cần để tạo ra một đại diện đầu ra .


1
Trong nhiều hệ thống phần mềm, việc hiển thị một phần tử phụ thuộc vào mức độ bảo mật của người dùng. Mặc dù bạn có thể ngăn chặn việc hiển thị một mục dữ liệu bằng cách đặt nó thành 0 hoặc null trong Mô hình xem, tên hoặc mô tả của mục dữ liệu vẫn sẽ được hiển thị. Nơi duy nhất mà bạn có thể ngăn chặn việc hiển thị mô tả mục dữ liệu (theo cách thực tế) là trong Chế độ xem.
Robert Harvey

Tôi có xu hướng không đồng ý. Tôi muốn nói rằng khung nhìn sẽ yêu cầu dữ liệu, bộ điều khiển sẽ thao tác mô hình và khung nhìn sẽ, một lần nữa, đại diện cho nó. Khung nhìn phải chịu trách nhiệm cho việc chỉ đại diện cho đầu ra.
rvcoutinho

Đó là lý do tại sao Chế độ xem cần ẩn các yếu tố trực quan mà người dùng không cần nhìn thấy. Bộ điều khiển không chịu trách nhiệm tạo ra biểu diễn trực quan của dữ liệu; Chế độ xem là. Tất nhiên, nếu những gì bạn đang hiển thị quá nhạy cảm đến mức nó thậm chí không thể ở trong Chế độ xem / Nguồn, thì điều mà bộ điều khiển cần làm là trả về một chế độ xem khác .
Robert Harvey

1
Đó là quan điểm của tôi. Quan điểm nên khác nhau. Theo tôi hiểu, có vẻ như chế độ xem chỉ nên quan tâm đến việc thể hiện dữ liệu. Theo đại diện, tôi có nghĩa là làm thế nào để hiển thị một cái gì đó, không phải khi nào để hiển thị nó. Tuy nhiên ý kiến ​​của bạn là hoàn toàn có liên quan.
rvcoutinho

Chà, tôi nghĩ rằng chúng ta có thể sử dụng cùng một biểu thức cho hai thứ khác nhau. Một quan điểm khác nhau là gì? Nhưng tôi nghĩ rằng chúng tôi đồng ý về vấn đề quan trọng nhất: nếu nó nhạy cảm về bảo mật, thì nó không nên được xử lý theo quan điểm.
rvcoutinho

1

Có một số vấn đề liên quan đến câu hỏi này.

  1. Xác thực (là người dùng mà anh ta nói là anh ta) không nên là mối quan tâm của Chế độ xem.
  2. Ủy quyền (Người dùng hiện tại có được phép làm điều này không ) mối quan tâm của Chế độ xem, bởi vì nó có thể ảnh hưởng đến những gì được trình bày cho người dùng. Do đó, mã để hiển thị nút chỉnh sửa có thể được bao quanh với một điều kiện như if model.userCanEdit() ... endif.
  3. Việc xác định thuộc tính ủy quyền nào mà người dùng có, đó là logic nghiệp vụ và nên được đặt trong Mô hình. (Ví dụ: đặc quyền 'chỉnh sửa' yêu cầu bạn phải có 2000 danh tiếng; hoặc bạn phải là tác giả hoặc người điều hành)

0

Nếu chỉ hiển thị phần tử UI thì tôi nghĩ nó vẫn ổn (bạn sẽ làm thế nào nữa chứ?). Nếu có bất kỳ dữ liệu nào trong các phần tử đó, mô hình sẽ đảm bảo rằng các thùng chứa trống. Và tất nhiên, mã để có được dữ liệu cấp phép nên được xử lý trước khi xem, do đó không có quyền truy cập hoạt động vào mô hình ở đây.


0

Nếu một khung nhìn kiểm tra rõ ràng bảo mật để hiển thị có điều kiện các thành phần UI, thì nó có vi phạm MVC bằng cách chứa logic nghiệp vụ không?

Vâng, đó là một sự vi phạm của MVC.

Khung nhìn chỉ có để hiển thị các thành phần và logic phải có trong mô hình. Bằng cách có chế độ xem làm một cái gì đó (trong trường hợp của bạn, kiểm tra bảo mật), bạn đang đặt logic ở đó.


Sau đó, làm thế nào để xem có thể hiển thị một cái gì đó như một nút chỉnh sửa hay không?
Matt S

@MattS Người trình bày gọi một chức năng trong dạng xem để hiển thị hoặc ẩn nút đó (tùy thuộc vào trạng thái trong mô hình).
BЈовић
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.