2012-01-22 3 views
1

나는 제안을 찾고 있는데, 클라이언트에서 서버로 안전한 방식으로 앞뒤로 ID를 전달하는 방법에 대한 제안이나 정말 좋은 자습서를 찾고 있는데, 사용자 ID 나 다른 것을 전달하지 않습니다. 그러나 나는 이드를 위해 을 전달할 수있다. 테이블 행. 이 ID를 사용자에게 숨기고 싶습니다. 나는 그들이 페이지에 그들을 넣는 것을 피할 수 있었으면 좋겠다. 그러나 그들이 pk라고 생각할 때, 나는 선택의 여지가 없지만 클라이언트에서 서버로 앞뒤로 값을 핑핑 (ping)하는 것이 좋다.Asp.net MVC 3 숨겨진 값 암호화

도움 주셔서 감사합니다.

편집 : 사용자가 이러한 작업을 수행 할 수있는 권한이 있는지 확인하지만 데이터를 숨기려고합니다.

답변

6

쉬운 제안 :

1) 발생있어 당신의 테이블에 GUID 열을 추가 (기본값 : 새로운 ID()). guid 열에 인덱스를 만듭니다. 귀하의 PK보다는 guid를 앞뒤로 전달하십시오.

2) 귀하의 ID를 완전히 보호합니까? 아닙니다.하지만 사용자가 숫자 PK를 추측하지 못하게합니다.

3) 인증 된 사용자가 레코드에 액세스 할 수 있는지 항상 온 전성을 검사합니다.

+0

완전히 동의합니다. 여기에서의 위험은 안전하지 않은 직접 객체 참조 (https://www.owasp.org/index.php/Top_10_2010-A4 참조)이며 올바른 완화 조치입니다. 암호화하더라도 올바른 사용자에게 표시된 리소스에 액세스 할 수있는 권한이 있는지 확인해야합니다. – blowdart

2

필자가 언급 한 것처럼 페이지의 HTML에있는 것처럼 볼 수있는 항목 테이블 행의 PK를보기로 출력하는 것은 이상적인 습관이 아닙니다.

올바르게 이해한다면 사용자의 ID를 '숨기는 것'이라면 ID의 모호성을 의미한다고 생각할 수 있습니다. 따라서 HTML의 뷰에서 가져온 경우에도 개별적인 상황에서는 거의 의미가 없습니다.

위의 방법을 달성 할 수있는 한 가지 방법은 ViewModel을 사용하여 바인딩 된 데이터를 뷰로 출력하는 것이지만 특정 ViewModel 클래스에서는 AES (양방향)로 PK를 인코딩하는 사용자 정의 속성 논리를 가질 수 있습니다) 암호화 알고리즘을 사용합니다. 암호화는 사용자와 서버에만 알려진 것입니다.

보기에서 PK를 '보호'하는 한 가지 방법입니다.

이러한 접근 방식을 사용하면 데이터가 앞뒤로 이어지는 경우 PK를 암호화/암호 해독 할 때 성능 오버 헤드를 고려해야 할 수 있습니다!

는 암호화 경로 내려갈 경우이 관심이있을 수 있습니다

Simple insecure two-way "obfuscation" for C#

당신은 또한 메모리 (캐시 또는 세션 데이터)함으로써 암호화없이 어떤 큰 투명도를 달성 할 수있는 키 -를 값 조회는 임의의 숫자를 각 테이블 항목의보기에 ID로 출력하고보기에서 검색 할 때 PK는 메모리 내 모음에서 역순으로 조회합니다.

+0

약간의 오해의 소지가있는 Henry 일 수 있습니다. MD5는 단방향 암호화 해시 기능입니다. 디코딩 할 수있는 방식으로 데이터를 암호화하거나 인코딩하는 데 사용할 수 없습니다. 데이터의 유효성을 검사하는 데 사용할 수있는 해시 값을 생성합니다. –

+0

당신은 내 오해를 바로 잡아 주셔서 감사합니다. 이 경우, 상기와 같은 양방향 암호화 알고리즘을 사용하여 서있을 것인가? http://stackoverflow.com/questions/165808/simple-2-way-encryption-for-c-sharp –

+0

해시를 사용하면 제시되고 재생되어야하는 이와 같은 값이 훼손되었다. 이것이 바로 ASP.NET에서 ViewState 유효성 검사가 작동하는 방식입니다. 값이 변경되지 않았는지 확인하는 데만 관심이 있다면 해시 유효성 검사 만 있으면됩니다. 그러나 사용자가 값을 알지 못하게해야하는 경우에는 다음과 같은 값을 사용하여 값을 암호화해야합니다. AES 암호화 루틴은 프레임 워크에서 사용 가능합니다. –

3

정말로 서버에서 보안 조치를 취해야합니다. 사용자가 액세스 할 수있는 모든 레코드를 사용할 수 있어야하며 액세스 권한이없는 레코드는 없어야합니다. 데이터에 대한 액세스 권한이있어 ID가 무엇인지 알면 중요하지 않습니다. 해킹으로 할 수있는 일은 UI에서 할 수 있습니다.

이와 같이 단순히 숨기려하지 않는 것이 좋습니다.

2

MVC 보안 확장 프로젝트 https://mvcsecurity.codeplex.com을 사용할 수 있습니다.

[ValidateAntiModelInjection("Id")] 

보기에 추가 내 :

@Html.AntiModelInjectionFor(m => m.Id) 
@Html.HiddenFor(m => m.Id) 

아이디를 게시에

는 컨트롤러 포스트 방법에

추가 ... 보호 할 필드가 이드 말 입력란의 유효성을 검사합니다.