2016-10-12 2 views
-1

URL은 말한다 :다른 레코드에 액세스하기 위해 사용자가 URL에서 ID를 변경하는 것을 중지시키는 방법? ASP를 MVC 4</p> <p>사용자가 학생 기록에 간다 사용

http://studentTracker.org/Record/Student?studentId=380 

현재 않는 한, URL에 바로 거기 studentId을 변경하고 학생들의 기록을 얻을 수있는 사용자 그것은 존재하지 않습니다. 쿼리 문자열 부분을 URL에 숨기거나 사용자가 URL을 변경 한 경우 컨트롤러에서 검색/유효성을 검사하는 방법은 무엇입니까?

+0

내가 ASP를 함께 작동하지만 사용자를 저장하지 않는거야 세션 변수 또는 쿠키의 ID를 확인한 다음 저장된 값을 비교합니다. 변수를 'studentId'의 값으로 변경하십시오. 일치하지 않으면 사용자를 어딘가에 리디렉션합니다. –

답변

1

첫 번째로 사용자가 실제로 아무것도 할 수 없도록 막을 수는 없지만 특히 URL에서 ID를 변경하는 것과 같은 것입니다. 당신이 할 수있는 일은 실제 콘텐츠 대신 404 또는 403과 같은 것을 얻을 수 있도록하는 것입니다.

이 작업을 수행하는 방법은 객체 수준의 권한 부여를 수행하는 것입니다. 기본적으로 개체를 어떤 방식으로 보거나 편집 할 수있는 사용자에게 묶는 것입니다. 일반적으로이 작업은 "사용자"엔티티 또는 그룹이나 역할과 같은 더 광범위한 항목의 외래 키를 통해 수행됩니다.

예를 들어, "Student 380"레코드가 jdoe에 의해 소유 된 경우 jdoe을 제외한 모든 사용자가 액세스 할 수 없도록하려면 먼저 "학생"엔티티의 "사용자"엔티티에 외래 키를 추가하십시오. (지정되지 않은 이후, 신원을 가정) :

public class Student 
{ 
    ... 

    [ForeignKey("Owner")] 
    public string OwnerId { get; set; } 
    public virtual ApplicationUser Owner { get; set; } 
} 

을 다음, 당신의 행동에, 대신 ID로 조회, 당신은 URL 인증 된 사용자의 ID에 ID를 모두 조회 :

사용자가 studentId을 변경하지만 일치하는 학생의 "소유자"로 설정되어 있지 않은 경우
var userId = User.Identity.GetUserId(); 
var student = db.Students.SingleOrDefault(m => m.Id == studentId && m.OwnerId == userId); 
if (student == null) 
{ 
    return new HttpNotFoundResult(); 
} 

지금, 그들은 404

+0

그래서이 상황에서 학생 기록을 볼 수있는 사람들은 카운셀러이며 그들은 모두 모든 학생 기록을 볼 수 있습니다. 따라서 보안 규칙을 적용 할 수없는 보안상의 이유가 없으므로 비즈니스 규칙에 관한 한 실제로는 괜찮습니다. 일반적으로 데이터를 가져 오는 것이 왜 매우 안전하지 않은 것 같습니다. 내 말은, 매개 변수가 헤더 나 뭔가 GET에 숨겨져있어 URL에 표시되지 않는다는 뜻입니까? – BattlFrog

+1

아닙니다. HTTP가 작동하는 방식이 아닙니다. URI는 "고유 한 리소스 식별자"입니다. 여기에서 'studentId'는이 클래스를 고유하게 만들고 서버가 특정 학생을 반환하도록 허용합니다. 또한 "안전하지 않은"것도 아닙니다. 첫째, ID와 같은 것이 데이터베이스 테이블 외부에 고유 한 값을 가지고 있지 않으며 누군가가 데이터베이스 테이블을 볼 수 있다면 URL에 ID를 노출하는 것보다 훨씬 긴급한 우려 사항이 있습니다. 사용자가 그것을 조작 할 수있는 한, 그것은 항상 내가 여기서 설명한 것과 같은 것을함으로써 그러한 조작에 대해 스스로를 강화하는 응용 프로그램에 있습니다. –