2012-04-14 2 views
4

User.Identity.Name을 사용하여 내 데이터베이스에서 데이터를 쿼리 할 수 ​​있는지 궁금합니다.
예 :"User.Identity.Name"이 안전합니까?

UsersBLL.GetPersonalInformation(string username) 

이 방법에 User.Identity.Name의 값을 전달시겠습니까 좋은 생각인가?
User.Identity.Name의 값을 도용 할 수 있습니까?

답변

2

도용 될 수 있습니까? 예, 예를 들어 insufficient transport layer protection (이 링크의 실제 예)으로 인해 세션 도용을 통해 발생하지만, 이는 회원 공급자 구현 자체로 인한 위험 요소가 아닙니다.

오히려 주변의 사용자 이름을 전달하는 대신, 나는 ID로 다루고 싶어요 :

var user = Membership.GetUser(); 
var userId = (Guid?)user.ProviderUserKey; 

내가 다시, 기본 멤버 자격 공급자를 사용하고, 가정 aspnet_Users 사용자 테이블 (에 따라 어떤 테이블을 가정)는 ID를 사용자 이름이 아닌 외부 키로 사용하고 있습니다. 적어도 나는 그것이 사실 이길 바란다!

+0

회원 자격 시스템을 사용하지 않고 자체 DB 만 사용하고 있습니다. 예, ID를 외래 키로 사용하고 있습니다. 하지만 나는 db에 대한 또 다른 왕복을 피하기 위해 내 메서드에 대한 사용자 이름을 사용하고 있습니다. 이것은 나쁜 습관입니까? 대신 사용자 ID를 전달해야합니까? 나는 단지 사용자 ID를 쿼리하고 나중에 사용하기 위해 캐시해야합니까? – Adir

+0

내부 구현이므로 하이재킹을 용이하게하는 방식으로 노출시키지 않고 적절한 액세스 제어를 사용하는 한 괜찮습니다. –

4

User.Identity.Name은 다른 어떤 수단보다 안전합니다. 그것을 납치하는 것이 가능한가? 어쩌면 SSL을 사용하지 않고 인증 메커니즘을 암호화하지 않고 SSL을 사용하고 암호화 된 FormsAuthentication 또는 Windows 인증을 사용한다면 괜찮을 것입니다.

기본적으로 훌륭한 보안 관례를 따르고 있다면 완벽하게 안전해야합니다. 적어도 사용자를 식별하는 다른 방법보다 덜 안전합니다.

편집 :

이것은 당신이 이름에 테이블을 키 입력이 아니라 회원의 아이디에 의해, 그리고 코드는 단지 이름으로 회원 테이블의 사용자 ID를 조회하지 않는 것으로 가정합니다.

사용자 이름에 테이블을 입력하는 경우 고려해야 할 몇 가지 보안 문제가 있습니다. 그 중 하나는 헨크가 대답 할 때 언급 한 것입니다. 사용자 이름을 변경하거나 재사용하도록 허용하지 않으면 문제가되지 않습니다.

+0

기본 인증 메커니즘에서 응용 프로그램을 보호합니다. 예를 들어, Kerberos에서 양방향 SSL 또는 Claims-from-hell으로 전환 할 수 있으며 응용 프로그램을별로 변경할 필요가 없습니다. – ixe013