it-swarm-korea.com

로그인 및 등록까지 모든 형태로 AntiForgeryToken을 사용해야합니까?

매일 수천 번 방문하는 대규모 사이트와 대규모 사용자 기반을 운영하고 있습니다. MVC 3으로 마이그레이션을 시작한 이후로, AntiForgeryToken을 보호 된 데이터 등을 수정하는 다양한 형식으로 배치했습니다.

로그인 및 등록과 같은 다른 양식도 지금 AntiForgeryToken을 사용하지만 몇 가지 이유로 인해 처음에는 거기에서 그들의 필요성에 대해 모호하게되고 있습니다 ...

로그인 양식에는 포스터가 올바른 자격 증명을 알아야합니다. 특히 요청이 동일한 호스트에서 온 것인지 확인하는 경우 (참조 자 헤더 확인) CSRF 공격이 어떤 이점을 얻을 수 있을지 생각할 수 없습니다.

AntiForgeryToken 토큰은 페이지가로드 될 때마다 다른 값을 생성합니다. 로그인 페이지에서 두 개의 탭을 연 다음 게시하려고하면 첫 번째 탭이 성공적으로로드됩니다. 두 번째는 AntiForgeryTokenException과 함께 실패합니다 (먼저 두 페이지를 모두로드 한 다음 게시를 시도하십시오). 더 안전한 페이지를 사용하면 로그인 페이지를 사용하는 것이 분명 악의적입니다.

토큰을 토큰 형태로 사용하거나 사용하지 않아야하는 다른 이유가있을 수 있습니다. 모든 게시물 양식에서 토큰을 사용하는 것이 과도하다고 가정하고 올바른 경우 어떤 유형의 양식에서 이점을 얻을 수 있으며 어떤 유형의 양식이 확실히 not 혜택?

추신 이 질문은 StackOverflow에서 또한 요청 됨 이지만 완전히 확신하지는 않습니다. 더 많은 security 적용 범위에 대해 여기에 물어볼 것이라고 생각했습니다.

82
Artiom Chilaru

예, 로그인 페이지에 위조 방지 토큰을 포함시키는 것이 중요합니다.

왜? "로그인 CSRF"공격 가능성이 있기 때문입니다. 로그인 CSRF 공격에서 공격자는 공격자의 계정으로 대상 사이트에 피해자를 로그인합니다. 예를 들어, 페이팔 사용자 인 Alice가 악의적 인 공격자 Evelyn에 의한 공격을 고려하십시오. Paypal이 CSRF 공격 (예 : 위조 방지 토큰 사용)으로부터 로그인 페이지를 보호하지 않으면 공격자는 Alice의 브라우저를 Paypal의 Evelyn 계정에 자동으로 로그인 할 수 있습니다. Alice는 Paypal 웹 사이트로 이동하고 Alice는 로그인했지만 Evelyn으로 로그인했습니다. 그런 다음 Alice가 페이지를 클릭하여 신용 카드를 Paypal 계정에 연결하고 신용 카드 번호를 입력한다고 가정합니다. Alice는 자신의 신용 카드를 Paypal 계정에 연결한다고 생각하지만 실제로는 Evelyn의 계정에 연결했습니다. 이제 Evelyn은 물건을 사서 Alice의 신용 카드로 청구 할 수 있습니다. 죄송합니다. 이것은 미묘하고 모호하지만, 로그인하는 데 사용되는 양식 작업 대상에 위조 방지 토큰을 포함시킬 정도로 충분히 심각합니다. 자세한 내용 및 이러한 실제 예는 이 백서 를 참조하십시오. 취약점.

위조 방지 토큰을 해제해도 괜찮습니까? 일반적으로 대상이 URL이고 해당 URL에 액세스해도 부작용이 없으면 해당 URL에 위조 방지 토큰을 포함시킬 필요가 없습니다.

대략적인 규칙은 모든 POST 요청에 위조 방지 토큰을 포함하지만 GET 요청에는 필요하지 않지만,이 대략적인 규칙은 매우 대략적인 근사치입니다. GET 요청은 모두 부작용이 없다고 가정합니다. 잘 설계된 웹 응용 프로그램에서는 그럴 듯하지만 실제로는 웹 응용 프로그램 디자이너가이 지침을 따르지 않고 GET 처리기를 구현하는 경우가 있습니다 부작용이 있습니다 (나쁜 생각이지만 드문 일이 아닙니다). 그래서 요청이 웹 응용 프로그램의 상태에 부작용이 있는지 여부에 따라 GET vs. 게시하다.

72
D.W.

로그인 페이지에 토큰을 두어야 할 경우 특정 자격 증명을 사용하여 누군가가 사이트에 악의적으로 로그인하지 못하게해야합니다. 누군가가 특정 사용자로 로그인 해야하는 것으로 프레임을 잡은 경우 이것이 사실임을 알 수 있습니다. 그렇게 말하면 약간의 예가됩니다.

2
Steve