Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + automatización eficaz

Evitar código fuente duplicado

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en ASPNET al evitar código fuente duplicado. El código repetido puede generar potenciales brechas de seguridad en la aplicación y agrega complejidad innecesaria a la misma.

Necesidad

Evitar código fuente duplicado en ASP.Net.

Contexto

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

  1. Se está desarrollando una aplicación en ASP.Net.

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

Solución

  1. El código duplicado es una secuencia de código que ocurre más de una vez, ya sea en el mismo programa, o en diferentes programas realizados por la misma entidad.[2] 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]. A continuación se presenta un ejemplo en el cual se declara una nueva clase y una constante para depurar los mensajes:

    MyApp.java
    1
    2
    3
      class Reuse
        {
            private static bool 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 valor verdadero:

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

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
       public static void divisionPorCero() {
            try {
                int x = 4;
                int y = x;
                Console.WriteLine("Resultado: "+(22/(x-y)));
    
            } catch (Exception e) {
                if (DEBUG) {
                    Console.Error.WriteLine("Error");
                    Console.Error.WriteLine("Causa "+e.Source+" "+e.Message);
                }
            }
        }
    
  4. Igualmente se define un segundo método que arroja la excepción la clase Integer con la cual termina el programa:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
            public static void integerParseInt() {
                try
                {
                    Console.WriteLine("Resultado: " + int.Parse("Fluid Attacks"));
    
                }
                catch (Exception e)
                {
                    if (DEBUG)
                    {
                       Console.Error.WriteLine("Error");
                       Console.Error.WriteLine("Causa " + e.Source + " " + e.Message);
                    }
                }
            }
    
  5. El error consiste en duplicar el código. Si la aplicación continúa creciendo y la metodología de duplicar el código sigue aplicándose, los cambios futuros en la aplicación como eliminar el mensaje causa, filtrar ciertas palabras de las excepciones, entre otros, pueden llegar a causar una fuga de información.

    Si los mensajes de error son manejados de forma centralizada, el cambio se hace únicamente en un lugar, por lo que un crecimiento futuro no representaría riesgo de fuga de información. Para evitar duplicar código se debe abstraer las llamadas en común a un nuevo método para ello se hace uso de una nueva clase y una constante para depurar los mensajes:

    1
    2
    3
       class Reuse
        {
            private static bool DEBUG = true;
    
  6. 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 demás llamadas:

    1
    2
    3
    4
    5
    6
    7
    8
            public static void showError(Exception e)
            {
                if (DEBUG)
                {
                    Console.Error.WriteLine("Error");
                    Console.Error.WriteLine("Causa " + e.Source + " " + e.Message);
                }
            }
    
  7. Ahora ambos métodos llaman al método showError:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
            public static void divisionPorCero() {
            try {
                int x = 4;
                int y = x;
                Console.WriteLine("Resultado: "+(22/(x-y)));
    
            } catch (Exception e) {
                showError(e);
            }
        }
            public static void integerParseInt() {
                try
                {
                    Console.WriteLine("Resultado: " + int.Parse("Fluid Attacks"));
    
                }
                catch (Exception e)
                {
                    showError(e);
                }
    



Haz un comentario

Estado de los servicios - Términos de Uso