2012-10-14 3 views
4

저는 DB 구조를 정의하기 위해 EF 코드 우선 접근 방식을 사용했습니다. 현재, EF 엔티티 클래스를 MVC 응용 프로그램의 일부 뷰에 직접 전달하고 있습니다. 이것은 내가 채워진 EF 클래스를 저장소에 직접 갖기 때문에 뷰를 채우고 저장할 수있게 해 주며, 컨트롤러가 포스트 백에서 EF 엔티티 클래스를받는다면 (유효성 검사가 유효하다면) 바로 그 것을 통과 할 수있다. 저장소에 저장하십시오. 그러나 잠재적으로 보안 위험입니까? 엔티티 클래스에 수정하지 않으려는 속성이있는 경우 클라이언트는 해당 속성을 포스트 백의 일부로 다시 제출하고 어쨌든 수정할 수 있습니까?뷰가 도메인 모델을 직접 사용하는 것은 위험합니까?

public class User { 
    [Required] 
    public string Firstname { get; set; } 
    [Required] 
    public string Surname { get; set; } 
    public DateTime DOB { get; set; } 
    public bool IsDisabled { get; set; } 
} 

내가 Firstname, SurnameDOB 편집 가능한 양식 필드를 노출 수,하지만 난에 사용자가 원하지 않는 예를 들어, 내가이 EF 모델을 전달하는 사용자를 편집 할 뷰를 갖고 있다고 IsDisabled을 설정하고 계정을 사용 중지 할 수 있습니다. 이것을 막는 가장 좋은 방법은 무엇입니까? 아마도 속성이 해당 도메인 모델에 의해 유지되어 사용자가 설정할 수 있거나 도메인 모델을 사용하여 물건을 표시하는 대신 물건을 다시 저장하는 것이 좋다고 생각할 때보기에서 도메인 모델을 직접 사용해야합니다. 데이터 저장소에?

답변

0

난 그냥이 게시물에 건너했습니다. 이 방법은 DB에서 업데이트 가능한 개체를 검색 한 다음 UpdateModel()을 사용하여 해당 개체에서을 업데이트하려는 필드 만 으로 설정합니다. '당신이 돈 어떤 필드를 업데이트 할 경우 시스템을 보호, 두 경우 모두

public bool UpdateUser(User updatedUser, Action<User, User> updateStrategy) { 
    // Retrieve User via updatedUser.UserID... 
    // Update it using updateStrategy(retrievedUser, updatedUser)... 
    // Save the updated retrievedUser to DB 
} 

// ... 
// To call the update method: 
repoUser.UpdateUser(updatedUser, (existingUser, updatedUser) => { 
    existingUser.Firstname = updatedUser.Firstname; 
    existingUser.Surname = updatedUser.Surname; 
    existingUser.DOB = updatedUser.DOB; 
}); 

을 : 내 방법은 람다 업데이트 할 필드를 설정하기위한 책임이있다 ("업데이트 전략")을 취할 수있는 저장소의 Update 방법입니다 액션 메소드에 게시되었는지 여부에 관계없이 물론, 사악한 클라이언트가 숨겨진 UserID 필드를 수정할 수는 있지만, 나는 그것을 막을 필요가 없다고 생각합니다. 그것은 단지 어떤 사용자가 업데이트되고 있는지를 바꿔 주며 시스템에서 사용자에게 권한을 부여해서는 안되는 사용자를 업데이트 할 수 있다면 보안 결함이있는 것으로 보입니다.

2

가장 좋은 방법은보기 모델을 사용하는 것입니다. 그렇게하면 뷰 모델에 전혀 없기 때문에 IsDisabled과 같이 보이지 않는 속성에 액세스하려는 사람으로부터 보호받을 수 있으며 프리젠 테이션 계층과 도메인을 분리 할 수 ​​있습니다. EF 엔티티 (더 많은 속성, 더 많은 관계 등)를 확장해야하는 경우 뷰 모델은 변경하지 않아도됩니다.

5

예,보기에 엔티티를 직접 전달하는 것은 위험 할 수 있습니다. 기술적으로 문제는 엔터티에 직접 바인딩을 모델링 할 때입니다.

네, 제시된 상황이 발생할 가능성이 매우 높습니다. 더 나쁜. User 객체를 가정하고 공격자가 Set IsAdmin true와 같은 작업을 수행하기 위해 값을 제출하거나 사용자에게 할당 된 역할을 변경할 수 있습니다.

물론이 모든 것은 사용자가 데이터 구조를 알거나 추측 할 수 있는지 여부에 달려 있습니다. 그것은 우리가 HTML을 생성 할 때 종종 힌트를주는 표지가 있기 때문에 그렇게 어렵지는 않을 것입니다.

이 문제에 대한 해결책은 두 가지가 있습니다.

1)보기 모델을 사용합니다. 뷰 모델에는 뷰에서 허용되는 데이터 만 포함됩니다. 엔티티 모델로 다시 복사 할 데이터를 제어 할 수도 있습니다.

2) [Bind] 속성을 사용하여 다양한 속성을 화이트리스트 및 블랙리스트에 제외하고 포함 할 수 있습니다.

화이트리스트 또는 블랙리스트를 잊어 버리기가 훨씬 더 어렵 기 때문에 (특히 나중에 뭔가를 변경하고 바인딩 할 때마다 목록을 업데이트하는 것을 잊어 버리는 경우) 훨씬 더 어렵습니다. [Bind]도 바람을 피우고 엉성한 디자인을하는 것처럼 느낍니다.

3

실제로 엔티티 모델을 뷰 모델로 사용하지 않아도됩니다. 여기 예제는 내가 다른 곳에서 본 것보다 훨씬 뛰어나다 고 생각합니다.

게시자가 게시자가 User에 동의하면 그 데이터가 게시 될 수 있음을 나타냅니다. 잘못된 제출을 확인하지 않고 게시 된 사용자를 직접 매핑 한 경우 데이터베이스에 문제가 지속되었을 것입니다.그것은이 문제를 다루는 몇 가지 방법을 제공합니다
http://www.codethinked.com/ASPNET-MVC-Think-Before-You-Bind

,하지만 난 내 프로젝트에서 선택한 하나는 UpdateModel() 접근 방식의 변형입니다 :

관련 문제