2012-01-02 3 views
0

부터 several threads 나는 MVC 위조 방지 토큰의 사용이 사용자가 인증되지 않은 사이트 영역에서 과도하다는 것을 알 수 있습니다.인증되지 않은 시나리오에서 MVC3 AntiForgeryToken 사용?

site1, site2, site3 등에서 mysite.com에 일부 정보를 게시하는 응용 프로그램이 있습니다. 각 사이트에는 비동기 Javascript POST를 통해 POST 요청으로 전송되는 고유 식별자가 있습니다. site1-3에서 실행되는 Javascript는 mysite.com에서 생성 된 다음 일부 Javascript 변수가 채워진 사이트로 반환됩니다. 다음과 같이

그래서 라이프 사이클은 다음 사이트 개발에

  1. 페이지가 mysite.com에 자바 스크립트 참조를 가지고있다.
  2. 링크 참조는 site1로 돌아가는 Javascript를 생성하는 컨트롤러 경로입니다.
  3. 반환되는 JS의 끝 부분에는 site1의 페이지 방문자에 대한 세부 정보 인 URL, 브라우저 등이 포함 된 mysite.com으로 되돌아가는 POST 요청이 포함됩니다. 매개 변수 목록에 antiforgery 토큰을 추가하는 어떤 지점이있는 경우

내가 JS POST 요청의 수용 컨트롤러에 잘에서 POST 매개 변수를 읽을 수 있습니다, 그러나, 내가 무엇을 알고 싶어하는 것입니다.

그렇다면 초기 요청에서이를 생성해야하고 JS의 JS 변수로 다시 전달하여 site1로 반환 한 다음 두 번째 요청에서 POST 양식과 함께 다시 전달해야합니다.

mysite.com의 모든 처리는 유효한 계정이 발견 된 경우에만 발생하므로이 문제를 해결하는 데 필요한 사항이 있습니까?

그렇다면 컨트롤러 수준에서 위조 방지 토큰을 어떻게 생성합니까?

답변

0

게시되는 데이터의 민감도에 따라 달라집니다. 다른 사용자가 위조 된 요청을 만들고이를 제출함으로써 해를 입을 수 있다면 적절하다고 말할 수 있습니다. 그럴 가능성이 없도록 일부 사용 정보 만 수집하는 것 같습니다.

일회성 임의 넌스가 더 나은 해결책 일 수 있습니다. 이렇게하면 요청을 위조하고 캐시 된 사본을 사용하는 사용자로부터 잘못된 다중 제출을 방지하기가 어려워집니다. mysite.com에서 임의의 값 (GUID가 작동 할 수 있음)을 생성하여 데이터베이스에 삽입하고 사용하지 않는 것으로 표시합니다. POST와 함께 다시 보내십시오. 사용 여부를 확인하십시오. 사용되지 않은 경우 사용 된 표시 및 로깅 조치를 수행하십시오. 이미 사용 된 경우 중복 요청으로 요청을 삭제합니다.

POST를 할 필요가 없으므로 nonce를 사용하면 우연히 반복되는 것을 막을 수 있으므로 URL 매개 변수가있는 간단한 GET으로 충분합니다.

+0

저는 실제로 이미 이와 같은 것을하고 있습니다. 각 요청에 대해 두 개의 새 GUID가 만들어집니다. 첫 번째 GUID는 사용자를 참조하고 클라이언트 측에서 쿠키를 읽습니다. 해당 방문자의 GUID가 이미 내 DB에 있으면 해당 값을 사용합니다. 그렇지 않으면 쿠키를 설정하고 DB에 추가하십시오. 두 번째 GUID는 세션을 추적하는 데 사용됩니다 (3 분 만료). 나는이 두 가지 조합이 충분한 지 궁금 해서요, 아니면이 경우에는 요청 검증자인 세 번째 GUID를 만드십시오 (내가 올바르게 받으면). – ElHaix

+0

나는 이것이 꼭 필요한 것이라고 말하지는 않지만 요청이 실수로 반복 될 수있는 구멍을 막을뿐만 아니라 요청을 위임하는 것이 훨씬 더 어려워진다. 두 GUID 중 어느 것도이 작업을 수행하지 않습니다.성공적인 침입자는 3 분 안에 차단 된 사용자/세션 GUID를 사용하여 수천 개의 요청을 제출할 수 있습니다. 추가 일회성 넌스 추가의 복잡성에 대비하여 그러한 일이 발생할 위험을 감수해야합니다. – tvanfosson

+0

의미가 있습니다. 이 접근법을 추가하고 사용 된/사용되지 않는 개념을 좋아합니다. 감사. – ElHaix