Joven hacker sonriendo

Establecer Opciones por Defecto

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en PL/SQL al definir opciones seguras por defecto en estructuras condicionales. Es necesario establecer opciones seguras y controladas ante entradas inválidas para evitar posibles ataques.

Necesidad

Establecer opciones seguras por defecto en estructuras condicionales.

Contexto

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

  1. Se está desarrollando aplicación en PL/SQL.

  2. La aplicación utiliza estructuras condicionales, tales como IF-THEN o CASE.

Solución

Las entradas de la aplicación son uno de los medios más comunes para vulnerarla. Las estructuras condicionales generalmente se utilizan para definir el comportamiento del sistema ante una entrada del usuario. En otras palabras, permite la toma de decisiones. Cuando se utilizan estructuras condicionales es necesario definir escenarios seguros para todos los casos, aún para los casos no contemplados. Esto evita que usuarios maliciosos se aprovechen de escenarios no contemplados por la aplicación para realizar un ataque a la misma.

En cada estructura condicional empleada en una aplicación PL/SQL, se recomienda contemplar todos los posibles escenarios. Para ello debemos seguir el siguiente criterio:

  • Para sentencias IF como también para sentencias CASE debe usarse su correspondiente ELSE [1].

En el siguiente ejemplo, se muestra como validar las posibles opciones para la estructura condicional IF-THEN. Para ello debemos seguir el siguiente procedimiento:

  1. Creamos la función en la que utilizaremos la estructura condicional. En este caso será InconmeLevel. Esta función se encarga de recibir y clasificar los ingresos mensuales de una lista de empleados. El código se muestra a continuación:

    Uso adecuado de IF-THEN en PL/SQL
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    CREATE OR REPLACE Function IncomeLevel
      ( name_in IN varchar2 )
      RETURN varchar2
    IS
          monthly_value number(6);
          ILevel varchar2(20);
    
          cursor c1 is
          select monthly_income
          from employees
          where name = name_in;
    
      BEGIN
    
          open c1;
          fetch c1 into monthly_value;
          close c1;
    
  2. Definimos los rangos de entrada válidos, y el procedimiento a realizar en cada rango.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
        IF
          monthly_value <= 4000 THEN
          ILevel := 'Low Income';
    
        ELSIF
          monthly_value > 4000 and monthly_value <= 7000 THEN
          ILevel := 'Avg Income';
    
        ELSIF
          monthly_value > 7000 and monthly_value <= 15000 THEN
          ILevel := 'Moderate Income';
    
  3. Finalmente agregamos el escenario por defecto ELSE para verificar opciones no consideradas. De esta manera incluimos cualquier otra entrada no válida, de tal forma que no se genere un error en la aplicación.

    1
    2
    3
    4
    5
    6
    7
    8
        ELSE
          ILevel := 'High Income';
    
        END IF;
    
      RETURN ILevel;
    
    END;
    

Para la sentencia condicional CASE realizamos un proceso similar al mostrado anteriormente.

  1. Iniciamos definiendo la variable que evaluaremos con la sentencia CASE. En este caso evaluaremos una variable asociada a una calificación.

    Uso adecuado de CASE en PL/SQL
    1
    2
    3
    4
    DECLARE
    degrees CHAR (1);
    BEGIN
      degrees: = ' B ';
    
  2. Definimos las calificaciones válidos, así como los procedimientos a realizar en cada caso. Las calificaciones válidas serán A , B , C , D y F.

    1
    2
    3
    4
    5
    6
      CASE degrees
        WHEN ' A ' THEN DBMS_OUTPUT.PUT_LINE (' Excellent ');
        WHEN ' B ' THEN DBMS_OUTPUT.PUT_LINE (' Very Good ');
        WHEN ' C ' THEN DBMS_OUTPUT.PUT_LINE (' Good ');
        WHEN ' D ' THEN DBMS_OUTPUT.PUT_LINE (' Fair ');
        WHEN ' F ' THEN DBMS_OUTPUT.PUT_LINE (' Poor ');
    
  3. Finalmente agregamos la sentencia ELSE antes de END CASE. Allí definiremos el mensaje de error que se mostrará cuando se ingresa una entrada no valida.

    1
    2
    3
        ELSE DBMS_OUTPUT.PUT_LINE (' No such degrees ');
      END CASE;
    END;
    

    De esta forma abarcamos todas las opciones posibles, evitando fallos o comportamientos no deseados ocasionados por una entrada inválida.




Haz un comentario

Estado de los servicios - Términos de Uso