2012-12-13 9 views
3

모든 양식에 @Html.AntiForgeryToken()이있는 기본 MVC 프로젝트에서 특정 사용자 세션에 대해 모두 양식의 토큰 (쿠키) 값이 항상 동일하다는 것을 알았습니다. 왜 그런가요? 부분적으로는 이해합니다 (그렇지 않으면 뒤로 버튼과 같이 많은 문제가있을 것입니다). 그러나 왜 안 "소금"을 사용하여 서로 다른 양식이 다른합니다..ASP.NET MVC 위조 방지 이해

"이 방법은 사용되지 않습니다를 사용자 정의 데이터 토큰에 포함되는 지정하려면 AntiForgeryToken() 메소드 대신 를 사용하여 정적 를 사용 AntiForgeryConfig.AdditionalDataProvider 속성. "

왜 이렇게 큰가요? (예를 들어 207 바이트, 사용자 ID 이름은 7 자입니다)? 표준 세션 ID는 훨씬 더 짧습니다 (41).

+0

'AntiForgeryToken'은 숨겨진 양식 값이 아닙니까? –

+0

입니다. 그러나 생성 된 토큰은 쿠키와 숨겨진 필드에 저장됩니다. 포스트에서 유효성 검사를 통과하기 위해서는 값이 동일해야합니다. – UserControl

+0

아, 맞아. 잡았다! –

답변

3

사용자 세션에 대해서만 고유해야하는 이유는 CSRF 취약점을 어떻게 악용하는지에 대한 이유 때문입니다.

기본적으로 CSRF는 악의있는 ​​사용자가 미리 설정 한 양식 값에 의존합니다. 악의적 인 사용자는 일반적으로 GET 매개 변수로만 양식 값을 설정할 수 있습니다. 그들은 합법적 인 양식에 존재할 수있는 값을 가져 오거나 읽을 수 없으며 신뢰할 수있는 방법으로 모든 사용자에 대해 207 길이의 코드를 추측 할 수 없습니다.

악의적 인 사용자가 어떻게 든이 '라이브'정보를 얻을 수있는 XSS 취약점이있는 경우는 예외입니다. 하지만 XSS 취약점이 존재하기 때문에 어쨌든 CSRF를 사용할 필요가 거의 없습니다.

각 사용자 세션마다 고유 한 값이있는 한, 악의적 인 사용자가 미리 적절한 양식 제출을하는 것은 사실상 불가능합니다.

+0

어째서 'AntiForgeryToken()'에 소금이있는 과부하가 존재합니까? – UserControl

+0

@UserControl 원한다면 고유 한 기능을 추가 할 수 있습니다. 나는 내 머리 꼭대기에서 그것을 필요로하는 웹 애플리케이션 유형을 상상할 수는 없지만, 그 가능성을 허용하고 싶다고 가정한다. 또는 토큰의 임의성을 늘리는 것일 수도 있습니다. –

+0

알았습니다! 그 크기에 대한 어떤 추측이라도? 세션 ID를 해시하지 않는 이유는 무엇입니까? – UserControl

관련 문제