2011-09-15 6 views
11

저는 응용 프로그램에서 간단한 CSRF 보호를 설정했습니다. 양식을 제출할 때 세션 값에 대해 유효성이 검사되는 고유 한 부스러기를 만듭니다.CSRF 토큰 - 올바르게 구현하는 방법?

불행히도 이것은 이제 CSRF 부스러기가 서로 충돌 할 때 내 애플리케이션의 여러 인스턴스 (브라우저의 탭)를 동시에 열어 둘 수 없음을 의미합니다.

실제 양식마다 개별 토큰을 만들거나 모든 양식에 대해 상호 공유 부스러기를 사용해야합니까? 여기에 상식은 무엇입니까?

답변

5

둘 중 하나를 수행 할 수 있습니다. 원하는 보안 수준에 따라 다릅니다.

OWASP ESAPI (Enterprise Security API)는 사용자 세션 당 단일 토큰 방식을 사용합니다. 아마도 XSS가 없다고 가정하고 세션 시간 제한이 적당하다고 가정 할 때 매우 효과적인 방법 일 것입니다. 세션을 며칠 또는 몇 주 동안 생존 상태로 유지하도록 허용하면 이는 좋은 접근 방법이 아닙니다.

개인적으로 각 양식의 각 인스턴스마다 다른 토큰을 사용하는 것이 어렵지 않습니다. 키 - 값 쌍을 사용하여 사용자 세션에 구조를 저장합니다. 각 항목의 키는 양식 ID이며, 값은 토큰을 포함하는 또 다른 구조이며 해당 토큰의 만기 날짜입니다. 일반적으로 나는 토큰이 10-20 분 동안 만 살도록 허용하고 만료됩니다. 긴 형식의 경우 긴 만료 시간을 줄 수 있습니다.

같은 세션에서 여러 브라우저 탭에서 동일한 양식을 지원하려면 내 방식이 조금 까다 롭지만 고유 한 양식 ID를 사용하여 쉽게 수행 할 수 있습니다.

+0

각 양식의 각 인스턴스마다 자체 토큰이 있음을 의미합니까? 예. ''? – Industrial

+4

나는 하나의 세션 당 하나의 토큰을 갖는 것이 http (오직 https)를 통해 제출하지 않는 한 적당하다고 생각한다. 그들은 많은 보안 문제를 세션 ID와 공유합니다. XSS가있는 경우 공격자는 iframe을 열고 토큰을 읽으며 CSRF를 수행 할 수 있습니다. – Erlend

+0

XSS가있는 경우 이미 분실했습니다. 추가적인 폼 별 nonce는 당신을 구해주지 않을 것입니다 (공격자는 새로운 nonce를 가진 새로운 폼을 얻을 수 있고, 사용자가 작성한 것처럼 폼을 채우고 제출할 수 있습니다). 사용자 당 단일 값은 CSRF에 절대적으로 충분합니다. – Kornel

1

첫 번째 끄기 : 나는 보안 전문가가 아니므로, 내가 말하는 말을 신뢰해서는 안됩니다.

모든 양식에 대해 다른 토큰을 생성하는 것이 더 안전하다고 생각합니다. 공격자가 해당 양식에 대한 CSRF 토큰을 얻을 수있는 XSS 취약점을 한 페이지에서 고려하십시오. 모든 양식이 동일한 토큰을 사용하면 공격자는 모든 양식에 대해 CSRF 토큰을 갖게됩니다. 모든 양식의 토큰이 다른 경우 공격 범위가 훨씬 좁아 질 수 있습니다. 나는 CSRF에 대해 알다시피

+3

죄송 합니다만 XSS가있는 경우 공격자는 iframe을 지정된 양식으로 열어 토큰을 읽을 수 있습니다. XSS가있는 경우 토큰 접근이 실패하고 XSS를 피하는 이중 제출 쿠키 접근 방식에서도 마찬가지입니다. – Erlend

-3

, 당신은

1) 임의의 번호를 사용하고 세션으로 저장할 수 있습니다 : 당신이 정보를 받아 봐 때
숨겨진라는 숨겨진 입력을 추가, 당신은 숨겨진 필드를 확인하실 수 있습니다 세션 값

2) 이전하지만 세션 같은 정적 구성 변수()
숨겨진 필드는이 값 (구성에서 변수)를 포함한다. 유효성을 검사 할 때 게시 숨겨진과 설정 보안 키 값

3) HTTP 리퍼러를 확인합니다
다음에서 오는 사용자가이 방법은 수 (실제 도메인을 확인 어디 있는지 알고 리퍼러를 사용할 수 있습니다 웹 사이트에 xss가있는 경우 공격).

나는 당신이 어떤 솔루션 :

+1

두 번째 예; 어떻게하면 정적 변수를 CSRF 토큰으로 사용할 것을 제안 할 수 있습니까? 토큰 뒤에있는 전체 아이디어는 고유성이므로 아무도 사전에 토큰이 무엇인지 추측 할 수 없어야합니다. 어떻게하면이 모든 형태가 더 안전 해 질까요? – Industrial

+1

2는 사용자별로 키가 아니기 때문에 작동하지 않습니다. 3 많은 회사 방화벽이 리퍼러 헤더를 제거하기 때문에 권장하지 않습니다. 실제로는 실현 불가능합니다. – Erlend

+0

HTTP Referer는 CSRF를 이길 수있는 안전한 방법이 아닙니다. (정적 변수가 아닙니다.) –

4

OWASP Cheat Sheet 이런 종류의에 대한 가장 확실한 대답을 가지고 사용할 수 있습니다 아시다시피. 다양한 접근법과 보안 대 가용성의 균형에 대해 설명합니다.

간단히 말해서 (브라우저) 세션마다 단일 토큰을 사용하는 것이 좋습니다. 즉, 귀하의 경우 동일한 토큰이 탭간에 공유됩니다. 치트 시트는 사이트 간 스크립팅 취약점에 사이트를 노출시키지 않는 것이 매우 중요하다는 점을 강조합니다. 이는 세션 별 CSRF 토큰 전략을 훼손하기 때문입니다.

관련 문제