2014-02-28 4 views
0

이미 CSRF 토큰이있는 시나리오가 있지만 제거해야합니다. 전자 상거래에서는 제품 페이지가 Varnish에 의해 캐시되므로 사용자가 여기에 직접 방문하면 토큰의 유효성을 검사 할 세션 ID가 없습니다. 이 페이지에서는 CSRF 토큰을 가진 "장바구니에 추가"버튼이 있지만 물론 잘못된 토큰으로 캐시됩니다.CSRF 토큰 피하기

제 질문은 : 토큰으로 숨겨진 입력에 의존하지 않고 CSRF 보호를하는 또 다른 방법이 있습니까? 단추가 놓여있는 페이지는 캐시되어야하므로이 경우 토큰이 좋지 않습니다.

감사합니다.

답변

0

CSRF에 쿠키를 사용할 수 있습니다. 쿠키는 양식 페이지에서 설정하고 다음 페이지에서 확인합니다. 약간의 개조가 필요할 수도 있지만 캐싱을 둘러싼 다.

해당 쿠키를 삭제하지 않도록 Varnish를 구성하는 것을 잊지 마십시오.

1

이 자바 스크립트는이 쿠키 값을 판독하여 형태 숨겨진 입력 요소로 분사 형태와 세션 ID를 제출 "Double Submit Cookies"

표제 OWASP CSRF 방지 치트 시트에 기재된 대안이있다. 이 작업을 수행하려면 세션 쿠키가 HTTPOnly으로 표시되어서는 안되며, 이는 나쁜 습관입니다. 따라서 CSRF에 일부를 추가하는 동안 세션 쿠키 보안을 잃게됩니다.

이 방법을 개선하여 CSRF 토큰 값을 저장하는 login으로 다른 쿠키를 만들고 sessionid 쿠키 대신이 쿠키를 사용할 수 있습니다. 이제 sessionid 쿠키를 HTTPOnly으로 표시 할 수 있습니다.

(Http 만도 나쁜 연습하지만 이전과 중요하지 않은 것처럼 CSRF 쿠키를 표시하지 않음)에 대한

2

(내가 AJAX를 통해 CSRF 토큰을 검색 맡기 모든 페이지에 호출하면 성능 이유로 옵션을 선택하지 않습니다) CSRF 토큰이 효과적이기 위해서는 쿠키 메커니즘 외부로 제출할 수 있어야합니다. CSRF 토큰을 검색하기 위해 페이지에서 AJAX POST를 실행하도록 만들 수 있습니다.

예컨대 https://www.example.com/GetCSRFToken

응답 :

{ "token": "abcdefg" } 

그럼 당신은 당신의 양식이 토큰을 제출할 수 있습니다. 별도의 요청이므로 응답은 캐시 된 페이지의 일부가 아닙니다. 이 방법의 유일한 단점은 JavaScript가 토큰을 검색 할 수 있도록 설정되어야한다는 것입니다. 이 시나리오를 처리하는 것이 가능할 수도 있습니다. JavaScript가 비활성화되어 양식이 토큰없이 게시 된 경우 실제 항목이 장바구니에 추가되기 전에 확인 단계를 추가 할 수 있습니다. 확인 페이지는 캐시되지 않도록 설정되어 각 사용자가 항상 세션의 토큰을 가져옵니다.

+0

이것은 CSRF 토큰을 가지지 않고 동일한 원천 정책에 의존하는 것과 동일합니까? '/ getCSRFToken '을 확보 할 수있는 유일한 방법은 다른 출처 정책을 통해 이루어지기 때문에 CSRF 공격을 마운트하는 대신 CSRF 토큰을 얻는 첫 번째 게시물 (두 번째 요청은 공격 요청),'/ GetCSRFToken'이 어떻게 보호되는지에 대해 뭔가 빠져있는 것이 아니라면? –

+0

csrf 공격에서는 값을 검색 할 수 없으며 보낼 수만 있습니다. 동일 원산지 정책은 쓰기를 허용하지만 읽지 않기 때문에 CSRF 완화를 사용해야하는 이유가 있습니다. 글쓰기 란 POST 요청이나 다른 '안전하지 않은'메소드를 의미합니다. 당신이 묻는대로 대답합니까? – SilverlightFox

+0

또는 귀하의 질문에 대해 오해하셨습니까? 나는 그것이 당신의 downvote 것 같아요? – SilverlightFox