2014-11-05 7 views
1

선견자 지위를 삭제하여 명확하게 재현합니다. 자세한 내용은 간단하게 코드를 단순화했습니다.Java Servlet - 서블릿이 보안화될 때 다른 JSESSION ID. 왜?

내 문제를 제시합니다.

내 서블릿하여 HelloWorld : 메시지 HellWorld와

public class HelloWorld extends HttpServlet { 

    private String message; 

    public void init() throws ServletException { 
     // Do required initialization 
     message = "Hello World"; 
    } 

    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     // Set response content type 
     response.setContentType("text/html"); 

     // session test 
     System.out.println(request.getSession().getId()); 

     PrintWriter out = response.getWriter(); 
     out.println("<html><head><script src='./dwr/engine.js'></script><script src='./dwr/util.js'></script></head><body><h1>Hello World</h1></body></html>"); 
    } 

    public void destroy() { 
     // do nothing. 
    } 
} 

서블릿 디스플레이 HTML 페이지와는 DWR (직접 웹 원격) 자바 스크립트 파일이 포함됩니다. DWR javascript 파일은 servlet/dwr /에서 검색됩니다.

의 Web.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app> 
    <display-name>TestDWR2</display-name> 

    <servlet> 
     <servlet-name>HelloWorld</servlet-name> 
     <servlet-class>test.HelloWorld</servlet-class> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>HelloWorld</servlet-name> 
     <url-pattern>/HelloWorld/*</url-pattern> 
    </servlet-mapping> 

    <servlet> 
     <servlet-name>dwr-invoker</servlet-name> 
     <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> 
     <init-param> 
      <param-name>config</param-name> 
      <param-value>WEB-INF/dwr.xml</param-value> 
     </init-param> 
     <init-param> 
      <param-name>debug</param-name> 
      <param-value>true</param-value> 
     </init-param> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dwr-invoker</servlet-name> 
     <url-pattern>/dwr/*</url-pattern> 
    </servlet-mapping> 

    <security-constraint> 
     <web-resource-collection> 
      <web-resource-name>Extranet resource</web-resource-name> 
      <description>Extranet resources</description> 
      <url-pattern>/HelloWorld/*</url-pattern> 
      <url-pattern>/dwr/*</url-pattern> 
     </web-resource-collection> 
     <auth-constraint> 
      <role-name>intranet_admin</role-name> 
     </auth-constraint> 
    </security-constraint> 

    <login-config> 
     <auth-method>BASIC</auth-method> 
     <realm-name>Extranet</realm-name> 
    </login-config> 

    <security-role> 
     <description>Intranet Admin</description> 
     <role-name>intranet_admin</role-name> 
    </security-role> 

</web-app> 

서블릿 /하여 HelloWorld 및/DWR이 securised된다.

<?xml version='1.0' encoding='utf-8'?> 
<tomcat-users> 
    <user username="tomcat" password="tomcat" roles="intranet_admin"/> 
</tomcat-users> 

HTTP 요청/응답 : 로그인은 바람둥이 사용자 데이터베이스를 기반으로하여 HelloWorld 서블릿 호출에 대한

DWR 서블릿 호출에 대한

enter image description here

(engine.js)

,210 DWR 서블릿 호출에 대한

(util.js) 당신이 할 수 DWR 서블릿 호출 (_System.pageLoaded.dwr)

enter image description here

를 들어

enter image description here

각 요청마다 JSESSIONID 변경 참조하십시오. 내 문제는 언젠가 해결할 수 없다 ...

나는 지난 며칠 동안 계속 진행 중이다. 나는 문제 만 서블릿이 보안 때 나타납니다 지금 알고

<web-resource-collection> 
     <web-resource-name>Extranet resource</web-resource-name> 
     <description>Extranet resources</description> 
     <url-pattern>/HelloWorld/*</url-pattern> 
     <url-pattern>/dwr/*</url-pattern> 
    </web-resource-collection> 

제거이 보안의 경우, 각 요청이 동일한 JSESSIONID를 반환합니다. 왜? DWR과 관련이 없습니다. 서블릿을 호출하여 jQuery와 같은 다른 JS를 반환 할 때도 같은 문제가 발생합니다.

도와 주시겠습니까?

https://www.wetransfer.com/downloads/dd1729b56d26e94b9d9a5dcb264dce0c20141105104229/a623a93ec2bcbb8b3ac8e2695cbe646c20141105104229/b4bc1e

당신은이 링크를 찾을 수 있습니다

, 코드 소스 :

당신은이 링크를 찾을 수 있습니다

는 전쟁 문제를 발견 바람둥이 (톰캣 7)에 배포하기 https://www.wetransfer.com/downloads/fd8a74c850a5beb32d6529576f15f42c20141105104405/6f89adba0c853d48e392edb1d3ca562620141105104405/f67f43

대단히 감사합니다.

+0

주셔서 감사합니다 ... 검색해야합니다. 일반적으로 인증을 할 때마다 새 세션 ID를 생성하여 다른 사람이 이전 (보안되지 않은) 세션 ID를 가지고 갑자기 로그인하지 않도록합니다. 기본 인증은 모든 요청에 ​​로그인하므로 세션 ID를 변경하는 것 같습니다. 어쩌면 세션이 여전히 유효하다면 BA를 건너 뛰는 어딘가에 세션 핸들러가없는 것일 수 있습니다.하지만 detault에는 확신이 없습니다. 어떤 바람둥이이며 밸브 및 필터에 대한 모든 글로벌 채널이 있습니까? 어떤 왕국을 사용합니까? – eckes

+0

Context.xml에서 changeSessionIdOnAuthentication = "false"로 설정하면 작동하지만 가능하면이 안전성을 유지하려고합니다. 안전을 지키기위한 또 다른 해결책이 있습니까? 서블릿 필터? 세션 처리기? 나는 바람둥이 7을 사용한다. 나는 org.apache.catalina.realm.UserDatabaseRealm 영역을 사용한다. 도움을 주셔서 감사합니다. –

+0

세션이 존재하거나 유효하면 (다시) 인증을 건너 뛰도록 tomcat을 구성하는 방법이 있어야한다고 생각합니다. 그러나 어떻게 생각하는지 모르겠다. – eckes

답변

1

나는 전쟁을 확인하지 않았지만 Tomcat 7에서 기본적으로 켜져있는 세션 고정 문제 일 수 있습니다. 기본적으로 세션 ID는 인증 될 때 변경됩니다. 자세한 내용을 확인하고 http://java.dzone.com/tips/turning-session-fixation

+0

사실, Context.xml에서 changeSessionIdOnAuthentication = "false"로 설정하면 작동합니다. 감사합니다. 안전을 위협하지 않는 다른 솔루션이 있습니까? 다른 사람? 내 질문에 대한 http 요청/응답의 캡처를 추가하려면 –

0

사실의 문제 있으면 바로 볼 끄는 시도, 내가 context.xml에에 changeSessionIdOnAuthentication = "false"로 설정하면, 을가 작동합니다

<Context path="/test" reloadable="true" docBase="D:\projects\test2\TestDWR" workDir="D:\projects\test2\TestDWR\work" > 
<Valve className="org.apache.catalina.authenticator.BasicAuthenticator" 
    changeSessionIdOnAuthentication="false" /> 
</Context> 

하지만 HTTP 것을 볼 수

enter image description here

안전을 손상하지 않을 다른 해결책이 있습니까 : 요청은 2 회를 ​​만들어? 서블릿 필터 또는 다른?

처음으로 데이터베이스에서 데이터를 검색하고 세션에서 설정하기 때문에 실제로 차단되었습니다. 그리고 두 번째 요청에, JSESSIONID 변화하기 때문에, 데이터가 더 이상 세션 없습니다 다시

내가이이 세션 고정에 대한 보호와 관련이 생각하는 당신의 도움이

+0

그래서 자신의 대답을 수락 해 주시기 바랍니다.) –

+0

브라우저가 BA를 사용하지 않고 시도하는 것은 정상이며, 권한 부여 헤더를 사용하여 재 시도하는 것은 401입니다. 나는 왜 브라우저가 자식 리소스를 위해 그런 일을하는지 잘 모르겠다. – eckes