Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Configurar Autorización para Servlets Programando

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al configurar la autorización para Servlets. En todas las aplicaciones es necesario definir los permisos de acceso para evitar el ingreso de usuarios no autorizados.

Necesidad

Autorización para Servlets usando programación en Java

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se dispone de un servidor de aplicaciones o contenedor de Servlets conforme con las especificaciones empresariales de Java que soporte la especificación 3.0 o superior.

Solución

  1. Inicialmente se configuran los usuarios que tendrán acceso a la aplicación. Este paso dependerá del contenedor de servlets que se esté usando y de la fuente de donde se extraigan los datos.

  2. Por ejemplo en Tomcat, y tomando como usuarios los definidos para el propio servidor, se deberá agregar en el archivo tomcatusers.xml usuarios con roles específicos, por ejemplo:

    tomcatusers.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <tomcat-users>
      <role rolename="tomcat"/>
      <role rolename="rol1"/>
      <role rolename="rol2"/>
      <user username="usuario1" password="clave1" roles="rol1"/>
      <user username="usuario2" password="clave2" roles="rol1,rol2"/>
      <user username="tomcat" password="tomcat" roles="tomcat"/>
      <user username="fsg" password="Flu-1.D/" roles="tomcat"/>
    </tomcat-users>
    
  3. Para autenticar los usuarios usando programación, la especificación Servlet 3.0 especifica los siguientes métodos de la interfaz HttpServletRequest:

    • login, el cual permite a una aplicación recoger un usuario y una contraseña como alternativa al tener que especificar una autenticación basada en formularios en el descriptor de despliegue.

    • logout, el cual permite a una aplicación reiniciar el identificador de quien hace la petición.

  4. A continuación se muestra un ejemplo de como usar los métodos. La estructura de carpetas que debe tener la aplicación es:

    1
    2
    3
    % ls -R *
    src/test:
    TestLogin.java
    
  5. Se crea el servlet TestLogin.java, configurando mediante anotaciones cuáles serán los roles permitidos.

  6. Primero, se especifica que pertenece al paquete test y se importan las clases necesarias para trabajar con servlets HTTP.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    package test;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import avax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
  7. Se especifica que el servlet se llamará TestServlet y que la URL que mapea a este será /TestServlet.

    1
    @WebServlet("/TestLogin")
    
  8. Se crea un servlet típico.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    public class TestLogin extends HttpServlet {
      public TestLogin() {
        super();
      }
    
      protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
          PrintWriter out = response.getWriter();
          response.setContentType("text/html;charset=UTF-8");
    
  9. Se obtienen los parámetros user y pass pasados usando el método GET.

    1
    2
    String user = request.getParameter("user");
    String pass = request.getParameter("pass");
    
  10. Se hace un login a nivel de programación y se muestra el mensaje Login exitoso en caso de una autenticación válida. En caso contrario, se lanzará una excepción y se mostrará el mensaje Login fallido. En cualquiera de los dos casos se borrará el identificador de quien hizo la petición.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
       try {
         request.login(user, pass);
         out.println("Login exitoso");
       }
       catch (Exception e) {
         //throw new ServletException(e);
         out.println("Login fallido");
       }
       finally {
         request.logout();
         out.close();
       }
     }
    }
    
  11. Para probar la aplicación, luego de hacer el despliegue se deben pasar por GET los parámetros user y pass:

  12. En su aplicación debe evitar usar el método GET para el servlet de autenticación, y en su lugar utilizar el método POST, esto es con el fin de evitar que las credenciales de sus usuarios queden almacenadas en la bitácora del servidor y en el historial de navegación.

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

TestLogin.java Servlet que muestra como configurar la autorización mediante el uso de servlets.




Haz un comentario

Estado de los servicios - Términos de Uso