Joven hacker sonriendo

Evitar Código Duplicado en Java

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al evitar código duplicado. El código duplicado agrega complejidad innecesaria y representa una fuente potencial de riesgos a la seguridad de la aplicación.

Necesidad

Evitar código fuente duplicado 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 en Java.

  2. Se desea evitar código fuente duplicado en la aplicación.[1],[2]

Solución

Es común encontrar código duplicado en diferentes tipos de aplicaciones, esta duplicación representa trabajo, riesgo y complejidad adicional, por lo que evitar duplicar código fuente es importante para mantener la seguridad de la aplicación [3].

Esta solución presenta una manera de evitar duplicar código fuente en aplicaciones Java.

  1. Declaramos una nueva clase y una constante para depurar los mensajes.

    Reuse.java
    1
    2
    public class Reuse {
      private static final boolean DEBUG = true;
    
  2. El método main llama a dos métodos que generan errores. Estos errores son impresos en pantalla si la constante de depuración tiene el valor verdadero.

    1
    2
    3
    4
    public static void main(String[] args) {
      divisionPorCero();
      integerParseInt();
    }
    
  3. El primer método arroja un error de división por cero. Vemos que los mensajes de error son impresos a través de la salida err, con la causa y el mensaje de excepción:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    public static void divisionPorCero() {
      try {
        System.out.println("Resultado: " + (1337 / 0));
      }
      catch (Exception e) {
        if (DEBUG) {
          System.err.println("Error");
          System.err.println("Causa: " + e.getCause());
          System.err.println("Mensaje: " + e.getMessage());
        }
      }
    }
    
  4. Igualmente, se define un método que arroja la excepción de análisis de la clase Integer.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
      public static void integerParseInt() {
        try {
          System.out.println("Resultado: " + Integer.parseInt("fluid"));
        }
        catch (Exception e) {
          if (DEBUG) {
            System.err.println("Error");
            System.err.println("Causa: " + e.getCause());
            System.err.println("Mensaje: " + e.getMessage());
          }
        }
      }
    }
    
  5. Como se puede apreciar, la duplicación del código se da en el uso de las excepciones en ambos métodos. El problema se presenta porque al realizar posibles cambios en la aplicación como eliminar el mensaje "Causa" o filtrar ciertas palabras de las excepciones, entre otros, pueden llegar a causar una fuga de información.

  6. En cambio, si los mensajes de error son manejados de forma centralizada, el cambio se hace únicamente en un lugar, por lo que un cambio futuro no representaría riesgo de fuga de información.

  7. Para evitar duplicar código se debe abstraer las llamadas en común a un nuevo método.

  8. Declaramos la nueva clase y una constante para depurar los mensajes:

    1
    2
    public class ReuseGood {
      private static final boolean DEBUG = true;
    
  9. El método main llama a dos métodos que generan errores. Estos errores son impresos en pantalla si la constante de depuración tiene el valor verdadero.

    1
    2
    3
    4
    public static void main(String[] args) {
      divisionPorCero();
      integerParseInt();
    }
    
  10. El método showError se encargará, de ahora en adelante, de manejar los mensajes de error. Un cambio en este método se ve reflejado en todas sus llamadas:

    1
    2
    3
    4
    5
    6
    7
    public static void showError(Exception e) {
      if (DEBUG) {
        System.err.println("Error");
        System.err.println("Causa: " + e.getCause());
        System.err.println("Mensaje: " + e.getMessage());
      }
    }
    
  11. Ahora los dos métodos llaman al método showError.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
      public static void divisionPorCero() {
        try {
          System.out.println("Resultado: " + (1337 / 0));
        }
        catch (Exception e) {
          showError(e);
        }
      }
      public static void integerParseInt() {
        try {
          System.out.println("Resultado: " + Integer.parseInt("fluid"));
        }
        catch (Exception e) {
          showError(e);
        }
      }
    }
    

Descargas

Puedes descargar el código fuente pulsando en los siguientes enlaces:

Reuse.java Código que reutiliza lineas.

ReuseGood.java Código que no reutiliza lineas.




Haz un comentario

Estado de los servicios - Términos de Uso