Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Liberar Recursos

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al liberar recursos. Las aplicaciones normalmente cuentan con un manejo de excepciones, es importante liberar la memoria utilizada para tratarlas mejorando su rendimiento.

Necesidad

Liberar recursos apropiadamente en Java.

Contexto

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

  1. Se está desarrollando una aplicación construida en Java 1.1 o superior.

Solución

Una excepción es la indicación de que se produjo un error en el programa. Las excepciones, como su nombre lo indica, se producen cuando la ejecución de un programa no termina correctamente, sino que termina de manera excepcional como consecuencia de una situación inesperada.

Las excepciones pueden producirse prácticamente por cualquier línea de código. Por tanto, es importante que al momento de desarrollar una aplicación, esta cuente con un manejo de excepciones adecuado, esto con el fin de evitar los posibles ataques que tienden a aprovecharse de dichos errores con el objetivo de obtener información confidencial o realizar otras acciones no deseadas.

El manejo de excepciones en Java se hace mediante el uso de las sentencias try y catch. El código que se considere puede producir una excepción es puesto dentro de la sentencia try, y el código que se ejecutará cuando se presente dicha excepción, irá dentro de la sentencia catch. De esa manera es posible capturar las excepciones cuando estas sucedan y tratarlas cuando se presentan.

Otro aspecto importante a la hora de desarrollar una aplicación es el consumo de recursos. Es decir, mantener un bajo consumo de recursos del sistema ayuda a disminuir los tiempos de ejecución, mejorando, de esta manera, el rendimiento y la experiencia del usuario final. Entonces, para lograr un manejo de excepciones con un uso eficiente de recursos se recurre a la implementación de la sentencia finally. Los bloques de código embebidos dentro de finally tienden a limpiar todos los recursos localizados dentro de una sentencia try. La ventaja de la sentencia finally es que permite ser ejecutada cada vez que una excepción ocurre en el bloque try. Si se combinan estas dos sentencias, en conjunto con la sentencia catch, se obtendrá una aplicación que maneja las excepciones de forma adecuada.

  1. La estructura típica que tiene un código que libera recursos en consultas a bases de datos se presenta a continuación:

    recursos.java
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    try
    {
      ...
      statement = conn.prepareStatement(query);
      rs = statement.executeQuery();
      ...
    }
    catch(SQLException e)
    {
      //codigo en caso de que halla un error
    }
    finally
    {
     ...
     // Se cierra el recurso una vez se termine de usar.
     if (statement != null) { statement.close(); }
     ...
    }
    
  2. El siguiente ejemplo libera recursos una vez se ha leído el archivo prueba, el cual contiene alguna frase dentro de él.

  3. Se definen las variables para lectura del archivo. Deben estar por fuera del try para que sean visibles también desde el catch y el finally.

    main.java
    1
    2
    3
    4
    5
    public class Main {
      public static void main(String[] args) throws java.io.IOException {
        File archivo = null;
        FileReader lectorArchivo = null;
        BufferedReader memoriaLector = null;
    
  4. En el bloque try se inicializan las variables y se lee el archivo.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    try {
      String ruta="./";
      //archivo = new File("prueba");
      archivo = new File(args[0]);
      lectorArchivo = new FileReader(archivo);
      memoriaLector = new BufferedReader(lectorArchivo);
      String linea;
      while((linea=memoriaLector.readLine())!=null){
        System.out.println(linea);
      }
    }
    
  5. Se capturan las excepciones.

    1
    2
    3
    catch(FileNotFoundException e){
      System.out.println("Se ha producido una excepción");
    }
    
  6. Se cierran recursos una vez se terminaron de usar, sin importar si se produjo excepción o no.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
      finally {
        if (lectorArchivo != null) {
          lectorArchivo.close();
        }
        if (memoriaLector != null) {
          memoriaLector.close();
        }
      }
     }
    }
    
  7. Se compila y prueba la aplicación.

    compilacion.shell
    1
    2
    3
    javac Main.java
    java Main
    archivo de prueba
    

Descargas

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

Main.java Clase Main.




Haz un comentario

Estado de los servicios - Términos de Uso