2014-09-04 5 views
0

나는 세션 확장을 최소화하기 위해 주로 ViewScoped 빈을 사용하는 webprojekt에서 일하고있다. 그러나 나는 (데이터베이스에 접근하기 위해) 빈 사이에 클라이언트 사용자 이름과 패스워드를 전송해야하는 문제에 직면한다.ViewScoped Bean간에 비밀 사용자 이름과 암호를 전송하는 방법은 무엇입니까?

나는 이와 같은 콩과 사용자 이름과 암호를 전송하는 플래시 객체를 사용하고있는 시스템을 만들었습니다 :

public String gotoNextView() { 
    ExternalContext external = FacesContext.getCurrentInstance().getExternalContext(); 
    external.getFlash().put("user_name", (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("user_name")); 
    external.getFlash().put("password", (String) FacesContext.getCurrentInstance().getExternalContext().getFlash().get("password")); 

    return "/../../next_view.xhtml"; 
} 

하지만 해커가 클라이언트를 조작하는 것이 든 가능 여부에 대한 걱정 따라서 플래시 객체를 노출하기 위해 서버를 트릭합니다!

내가 생각하고있는 또 다른 해결책은 사용자 이름과 비밀번호를 값으로 사용하여 웹 애플리케이션 용 JSESSIONID를 맵의 키로 저장하는 것입니다. 이 작업을 수행하기 위해 사용자 세션이 끝나거나 만료 될 때 콜백 메소드를 호출하여 맵에서 관련 JSESSIONID를 제거 할 수 있어야한다고 생각합니다. 하지만 그 솔루션의 문제점은 콜백을 구현하는 가장 좋은 방법이 무엇인지에 대한 의문이 생겨서 새로운 유사한 JSESSIONID가 서버에서 생성되기 전에 Map 항목이 제거된다는 것을 100 % 확신 할 수 있다는 것입니다. 기회가 극도로 적어서 짧은 시간 내에 일어날 가능성이 있음을 알고 있음). 또한 내가 어떤 이유로 JSESSIONID (사용자)가 JSESSIONID를 삭제 (예 : 데이터베이스 작업)하기 전에 JSESSIONID (사용자)와 함께 작업하는 빈을 가지고 무엇을 할 지 의심 스럽다. 유사한 JSESSIONID는 JSESSIONID와 다른 사용자가 섞여있는 다른 사용자를 위해 서버에 의해 생성됩니다.

나는이 문제에 대한 깊은 통찰력을 가진 사람이 모범 사례와 100 % 안전한 방법에 대해 쓴다. (JSF 웹 응용 프로그램 서버로 작업하는 대부분의 사람들이이 문제를 겪고 따라서 다른 사람들이 문제에 대한 최선의 해결책을 아는 데 도움이 됨). 감사.

+0

에 변수를 전달하기 전에 물건을 (오버 헤드를 고려) 암호화하지도 세션 또는 요청 범위에서. 응용 프로그램은 사용자가 아닌 데이터베이스 자체에 액세스해야합니다. – EJP

+0

사용자 이름에 세션 속성을 사용하고 싶지 않은 이유가 있습니까? 세션의 해당 정보 만 보유하면 세션이 소규모로 유지되고 모든 문제를 방지 할 수 있습니다. –

+0

@Martin Frey : HttpServletRequest 및 HttpServletResposne 객체 사용에 대해 이야기하고 있습니까? 나는 그걸하는 법을 모른다. –

답변

1

나는 당신이 여기 오해하고 있다고 생각합니다. 변수가 하나의 관리 빈에 상주하고 다른 관리 빈에 "전달"되었다고해서 실제 매체를 통해 실제로 이동한다는 것을 의미하지는 않습니다. 모든 뷰 적용 빈은 동일한 저장소 영역에 구현됩니다 (저는 이것이 UIViewRoot 개체라고 생각합니다). 이 레벨에는 사이에 내재적 인 Boundary of Trust이 있습니다. 두 bean (어쩌면 클라이언트 측 변수, URL 매개 변수 또는 기타 HTTP 아티팩트)간에 사용자가 액세스 할 수있는 이동이 없으면 위험이 표시되지 않습니다.

이 의미는 변수가 들어있는 특정 @ViewScoped bean에 관계없이 모두 동일한 취약점 (있는 경우)에 노출된다는 것을 의미합니다. 콩 사이에 변수를 "전달"해도 새로운 위험이 발생하지 않습니다. 값을 사용자 (URL 또는 숨겨진 HTML 양식 요소)에 표시하는 경우가 아니면 @ViewScoped 객체 자체에 새로운 위험이 발생하지 않습니다. 범위를 잘못 사용하면 다른 문제가 발생합니다. 당신은 여전히 ​​우려되는 경우

궁극적으로, 단지 *** 어디서나 *** 당신은 암호를 저장하지 말아야 다른 기업

+0

답장을 보내 주셔서 감사합니다. Servlet 내부에서 '모두 다'서블릿으로 컴파일된다는 사실을 알고 있습니다. 어떻게 든 서버를 속여서 Bean 속성과 플래시 객체를 노출시키는 방법이 있는지 궁금해하고있었습니다. (해커가 할 수있는 일은 매우 창의적이며 가능한 것의 '정상적인'아이디어를 넘어서는 것입니다.) 지금까지 내가 아는 한, 해커가 전체 서버가 손상되지 않으면 bean을 '내부에 넣을 수 없습니다. 그러면 모든 솔루션이 떨어집니다! 하지만 스프링 보안을 사용하거나 다른 문제가 더 나은 해결책일까요? –

+0

그냥 내 질문을 명확하게하려면 해커가 콩 또는 플래시 개체를 해킹하는 것을 의미하는 것은 콩 속성 또는 플래시 개체에 액세스하기위한 몇 가지 고급 GET 또는 POST 요청을 만들 수 있는지 여부입니다 ! 가능한 '편집증적인'JSF 관련 보안 시스템이 필요합니다! –

+0

또한 DDoS 공격이나 버퍼 오버플로 공격으로 인해 Servlet이 Bean 속성 및/또는 플래시 객체를 노출 할 수있는 예기치 않은 작업을 수행 할 수 있다고 생각합니다. 어쩌면 해커가 할 수있는 일이라도 JSF webapp을 손상시킬 수 있습니다. –