Ocultar código PL/SQL en Database con wrapper

En ocasiones nos encontramos con código PL/SQL almacenado en Base de Datos con información sensible que no queremos que nadie vea, nada más que nosotros. Oracle dispone de una utilidad (wrap.exe) la cuál puede servir para proteger la propiedad intelectual del código de los desarrolladores, ya que deja el código en un formato no legible.

Se puede invocar desde el S.O. o desde la propia Base de Datos (a partir de 10G). Vamos a ver las ambas opciones:

Imaginar que tenemos el siguiente código;

CREATE OR REPLACE procedure ADMIN.kill_session
( v_sid number, v_serial number )
as
v_varchar2 varchar2(100);
begin
execute immediate 'ALTER SYSTEM KILL SESSION '||''''|| v_sid || ',' || v_serial 
|| '''' || ' immediate;';
end;
/

Desde el S.O.:

Podemos ver el resultado de aplicar wrap.exe al procedimiento:

Ahora los subimos a Base de Datos y comprobamos que queda en un formato ilegible:

Uso del paquete DBMS_DDL para wrapping dinámico:

Este paquete contiene tres funciones sobrecargadas llamada WRAP. La más simple acepta parámetros de entrada del tipo VARCHAR2 conteniendo una sentencia PL/SQL CREATE OR REPLACE que retorna el PL/SQL ilegible. Veamos el siguiente ejemplo:

 

Esto funciona correctamente con código PL/SQL menor o igual a 32K, pero el parámetro de entrada VARCHAR2 no puede hacer frente a código más grande. Para solventar esto podremos utilizar las funciones sobrecargadas:

DBMS_DDL.WRAP(
   ddl      DBMS_SQL.VARCHAR2S,
   lb       PLS_INTEGER,
   ub       PLS_INTEGER)
  RETURN DBMS_SQL.VARCHAR2S;

DBMS_DDL.WRAP(
   ddl      DBMS_SQL.VARCHAR2A,
   lb       PLS_INTEGER,
   ub       PLS_INTEGER)
  RETURN DBMS_SQL.VARCHAR2A;

La diferencia entre ambas es el tipo DBMS_SQL.VARCHAR2S limitado a 256 bytes por línea, mientras que el tipo DBMS_SQL.VARCHAR2A mantiene un máximo de 32K por línea. Mostraré un ejemplo:

 

Deja un comentario