Início‎ > ‎

Criar nova sessão após a autenticação do usuário

Muitas aplicações web e, em especial, aplicações J2EE costumam gerar identificadores de sessão para os usuários mesmo quando não ocorre a autenticação dos usuários. Isto pode ser um comportamento necessário, no caso de um site de compras, por exemplo, ou apenas um efeito colateral do uso de frameworks baseados em sessões.

No entanto, é importante que uma nova sessão seja criada para o usuário depois do processo de autenticação. Isto evita a ocorrência de ataques de session fixation. Num ataque deste tipo, o adversário faz com que o usuário acesse a aplicação usando um identificador de sessão conhecido pelo adversário. Isto poderia ocorrer através de ataques de phishing, por exemplo, ou explorando vulnerabilidades de cross-site scripting. Depois que o usuário se autentica na aplicação, se a aplicação não criar uma nova sessão com um novo identificador, o adversário para a conhecer um identificador válido para uma sessão autenticada, podendo se valer das credenciais do usuário junto à aplicação.

Para evitar ataques de session fixation, a aplicação deve gerar uma nova sessão para o usuário sempre que ocorrer a autenticação. Se houver alguma informação na sessão anônima que puder ser necessária no decorrer da sessão, a aplicação deve associar esta informação à nova sessão recém criada.

O código abaixo mostra como abandonar uma sessão a criar outra após a autenticação:
public class ExampleLoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
if( //autenticação bem sucedida ) {
request.getSession().invalidate();
HttpSession session = request.getSession(true);
session.setAttribute("AUTHENTICATED", new Boolean(true));
response.sendRedirect("PageRequiringAuthentication.jsp");
No caso de aplicações Struts 2, o código abaixo é mais apropriado:
if(//autenticação bem sucedida)  {

/* Renovação do identificador de sessão */
((SessionMap)this.session).invalidate();
this.session = ActionContext.getContext().getSession();

session.put("AUTHENTICATED", new Boolean(true));

return SUCCESS;
}

else
return ERROR;
}

Fonte

COBLENTZ, Nick. JSESSIONID Regeneration in Struts 2. Nick Coblentz blog, Sep 2008: http://nickcoblentz.blogspot.com/2008/09/jsessionid-regeneration-in-struts-2.html
Comments