Joven hacker sonriendo

Prevenir Inyección SQL

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Finacle Script al prevenir ataques de inyección SQL. Mediante la validación de entradas es posible reforzar la seguridad de la aplicación evitando este tipo de ataques.

Necesidad

Prevenir SQL Injection usando sentencias parametrizadas.

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 Finacle Script.

  2. La aplicación requiere de una conexión a una base de datos relacional a través del lenguaje de consulta SQL.

  3. Se requiere prevenir inyecciones usando sentencias parametrizadas soportadas por el lenguaje.

  4. Debe validarse la entrada de información antes de ser usada [2].

  5. Debe validarse la entrada de información en el servidor y no sólo en el cliente [3].

Solución

Las inyecciones de código SQL representan uno de los ataques más comunes y peligrosos en las aplicaciones cuando se manejan bases de datos relacionales. Éstos se generan cuando un usuario malicioso ingresa una consulta SQL disfrazada como una entrada del sistema. La aplicación al no validar apropiadamente las entradas, ejecuta la sentencia'SQL maligna generando una brecha de seguridad. De esta forma un atacante puede realizar todo tipo de modificación a la base de datos de la aplicación. Por ejemplo, conseguir nombres de usuarios y contraseñas (robo de credenciales), entre otra información confidencial (direcciones, teléfonos, números de cuentas bancarias, etc), eliminar tablas, modificar su contenido, entre muchas otras cosas.

Por suerte, existen muchas soluciones aplicables, de acuerdo al lenguaje de programación. En este artículo mostraremos cómo evitar ataques de inyección de código SQL en Finacle. Para ello debemos seguir los siguientes pasos:

  1. Se llama al script encargado de crear el repositorio CUST con sus respectivas clases:

    sqlifinacle
    1
    2
    <--START
      CALL("AS_CreateRep.scr")
    
  2. Obtenemos los datos provenientes del usuario name y type, inicializamos el contador de registros en 0.

    1
    2
    3
      CUST.CSDATA.name = TRIM(BANCS.INPUT.name)
      CUST.CSDATA.type = TRIM(BANCS.INPUT.type)
      CUST.CSDATA.recordCount = "0"
    
  3. Construimos la sentencia SQL, la cadena ?SVAR será reemplazada por el contenido de las diferentes variables pasadas en el argumento BINDVARS del user hook urhk_dbSelectWithBind.

    1
    2
    3
    4
    5
      sv_s = "recordCount|"
      sv_s = sv_s + "SELECT COUNT(*) "
      sv_s = sv_s + " FROM BANK "
      sv_s = sv_s + " WHERE name = ?SVAR"
      sv_s = sv_s + " AND type = ?SVAR"
    
  4. Para el ejemplo, el primer ?SVAR será reemplazado por el contenido proveniente de la variable name, y el segundo ?SVAR por el contenido de la variable type.

    1
      BANCS.INPARAM.BINDVARS = CUST.CSDATA.name + "|" + CUST.CSDATA.type
    
  5. Llamamos el user hook urhk_dbSelectWithBind. Internamente la función reemplaza los ?SVAR por el contenido de las variables, si la función devuelve 0 entonces se ejecutó exitosamente, diferente a 0 en caso contrario.

    1
      sv_r = urhk_dbSelectWithBind(sv_s)
    
  6. Se obtiene la salida de la sentencia.

    1
    2
    3
      IF (sv_r == 0) THEN
        CUST.CSDATA.recordCount = BANCS.OUTPARAM.recordCount
      ENDIF
    
  7. Es enviada al front end donde el usuario observa el número de registros encontrados.

    1
      urhk_SetOrbOut("recordCount|" + CUST.CSDATA.recordCount)
    
  8. Finalizamos la ejecución del script:

    1
    2
      EXITSCRIPT
    END-->
    
  9. También es posible parametrizar las variables en otras funciones como urhk_dbCursorOpenWithBind, con la cual podemos recorrer los registros obtenidos en un SELECT.



Haz un comentario

Estado de los servicios - Términos de Uso