2015-01-10 9 views
0

CSRF 공격을 막을 수있는 메커니즘이없는 레거시 Java 응용 프로그램 (13 세 이상)에서 작업 중입니다.레거시 애플리케이션에서 URL 재 작성으로 csrf를 개선 한 경우

프론트 엔드에서 여러 기술을 사용하고 있습니다. dwr, jquery 및 요청은 다양한 소스 인 AJAX에서 왔으며 요청을받습니다. CSRF로 보호되어야하는 Get 요청으로 수행되는 안전하지 않은 작업이 있습니다.

백엔드에서 모든 것이 Struts 액션을 통해 전달됩니다.

적절한 자동 기능 테스트가 없으며 응용 프로그램이 너무 많아 아무도 실제로 작동하지 않으므로 변경 사항을 쉽게 도입 할 수 없습니다.

모든 get-link 및 모든 양식 제출에 비밀 토큰을 추가하도록 응용 프로그램을 변경하는 것은 매우 어려울 것입니다. DWR 및 jquery의 경우 모든 요청에 ​​대해 단일 진입 점이 있으므로 간단한 작업이 가능합니다.

응용 프로그램은 브라우저 책갈피로 작업 할 필요가 없으며 내부적으로 책갈피 책갈피를 유지하는 즐겨 찾기 메뉴를 제공합니다. 또한 폼 동작 또는 링크 인 URL은 항상 스트럿 또는 표준 taglib을 통해 렌더링됩니다. 따라서 JSESSIONID를 쿠키 대신 URL 재 작성을 통과하도록 변경하면 응용 프로그램은 사소한 변경으로 인해 작동 할 것입니다 ...

위의 내용을 통해 엄청난 개발 노력 없이도 응용 프로그램에 CSRF 보호 기능을 도입 할 수 있습니다.

* 쿠키 대신 URL 재 작성을 사용하여 JSESSIONID를 전달하십시오. * 헤더에 JSESSIONID를 표시하는 문제를 극복하여 http 세션에 대한 두 번째 비밀 쿠키를 도입합니다. 따라서 세션이 처음 설정되면 임의의 값을 포함하는 HttpOnly 쿠키를 클라이언트에 보내고 HTTP 세션에도 넣습니다. * 모든 struts 작업의 상위 항목에서이 비밀 쿠키의 값을 HTTP 세션의 값으로 확인하고 같지 않은 경우 Exception을 발생시킵니다.

모든 요청에서 토큰을 소개하도록 응용 프로그램을 다시 작성하는 것과 비교하면이 방법이 쉬운 방법 인 것 같습니다. 어쩌면 너무 쉽게 ... 내 아이디어에 매거진이 있습니까?

답변

0

이전 게시물에서 URL 재 작성 및 인증을위한 두 번째 사용자 정의 HttpOnly 쿠키가있는 csrf 토큰으로 jsessionid를 사용하려고 생각했습니다. 는하지만 결국 난에 해결 :

  • 사용을 토큰 CSRF로 JSESSIONID를 사용하지만 기본적으로 설계되어, 인증을 유지하지.

  • 원본 헤더를 사용하여 양식 제출 및 ajax 호출을 보호합니다. 이는 안전하지 않은 작업을 수행하는 get 요청에는 적용되지 않습니다. 또한 최신 브라우저에서만 작동합니다.

  • csrf 토큰으로 get 요청을 보호합니다. 응용 프로그램의 URL은 c : url, html : rewrite 태그로 구성되므로 csrf 토큰을 포함하는 사용자 정의 태그로 이러한 태그를 다시 정의해야했습니다.