0

아무도 나를 도와주세요 수 없습니다. 기존 웹 응용 프로그램을 보호하도록 지정되었습니다.스프링 MVC 보안 토큰 기반 인증

문제 : 사용자가 이미 응용 프로그램에 로그인하면 (즉 세션이 활성 상태임을 나타냄) 공격자가 입력 필드를 추측하고 URL을 저장하고 유사한 페이지를 만들고 하이퍼 링크를 보낼 수 있습니다. 사용자가 해당 링크를 클릭하면 자바 스크립트를 통과하지 않고 스프링 컨트롤러에 도달합니다. 세션이 활성 상태이므로 공격자 데이터를 데이터베이스에 저장합니다.

다음은 현재 사용중인 것입니다. 1) 봄 보안

<http auto-config="true"> 
    <intercept-url pattern="/**" access="ROLE_ADMIN, ROLE_HR" /> 
    <custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" /> 
</http> 

<beans:bean id="siteminderFilter" class="com.mywbsite.security.UserFilter"> 
    <beans:property name="authenticationManager" ref="authenticationManager" /> 
    <beans:property name="continueFilterChainOnUnsuccessfulAuthentication" value="false"/> 
</beans:bean> 

이 메서드를 호출 할 때 응용 프로그램에 사용자가 로그인 할 때 사용자가 어떤 컨트롤러/자바

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
     throws IOException, ServletException { 

    System.out.println(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER)); 
    logger.info(request.getParameter(BaseConstants.DV_USER_SESSION_IDENTIFIER)); 
    logger.info("Existing the UserFilter.doFilter method..."); 
} 
에게 호출 아무것도 수행 할 때이 메소드가 불려

protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) { 

    String userId = request.getHeader("uid"); 
    logger.info("<<<<<<<<<<<<<<<<<<<<<userId>>>>>>>>>>>>>>>>>>>>>>> : "+userId); 

    return userId; 
} 

처음으로

솔루션 : 컨트롤러/필터에서 요청이 내 애플리케이션 또는 다른 곳에서 발생하는지 확인해야합니다.

다음은 구현하려는 것입니다.

  • getPreAuthenticatedPrincipal() 메소드 내에 임의의 토큰을 만들고이를 세션에 저장하십시오.
  • 세션에서 변수 가져 오기 jsp의 숨겨진 변수에 넣기
  • 사용자가 아무 작업을 수행하면 값이있는 숨겨진 변수를 전달하고 요청 매개 변수로 컨트롤러에 전달하십시오.
  • 컨트롤러/필터에서 세션에서 임의 값을 가져 와서 요청 매개 변수에서 숨겨진 값을 가져옵니다. 이제 비교해 보라. 일치하면 정상적인 작업을 수행하고 그렇지 않으면 오류 페이지를 반환합니다.

이제 위의 솔루션을 구현하면 각 JSP에 숨겨진 변수 코드를 작성하고 각 요청 및 요청 매개 변수에서 컨트롤러로 전달해야합니다.

간편하게 도와 줄 수 있습니까? 미리 감사드립니다.

+0

siteminder를 사용하려고합니까? 단일 사인온을 구현합니까? 세션 변수를 명시 적으로 처리 할 필요가 없습니다. –

+0

@JerinJoseph : 방금 문제를 업데이트했으며이를 해결하기 위해 어떻게 생각하고 있습니까? 다시 보시겠습니까? – SKumar

답변

0

Spring CSRF을 사용하여 위의 문제를 해결했습니다. CSRF를 구현하는 과정에서 문제가 발생했습니다. 문제는 CSRF가 2 개의 토큰을 작성하는 것이 었습니다. 근본 원인을 찾기 위해 오랜 시간이 걸렸습니다 (적어도 1 일). 루트 케이스는 필자의 Fiter에서 csrf 토큰 값을 얻고 아래 코드를 사용하여 인쇄하려고 시도한 것이 었습니다. 그래서 일단 request.getAttribute ("_ csrf") 요청을하면, 새로운 토큰을 생성합니다. 그래서 난 그냥 내 csrf에서 아래 라인을 delted하고 그냥 봄 csrf 링크에 설명 된대로 했어. 작동했습니다

//  CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); 
//  System.out.println(">>>>>>>>>>UserFilter.getPreAuthenticatedPrincipal() CSRF Token: " + token.getToken());