16 апреля 2026 года

Иногда возникает необходимость скрыть (обфусцировать) исходный код PL/SQL, особенно в целях безопасности, когда, например, мы предоставляем свой код третьим лицам, для чего традиционно используется инструмент WRAP, о котором мы подробно рассказываем в этой статье. Начиная с версии 10g R2, это действие можно выполнить с помощью пакета DBMS_DDL.WRAP, о котором мы расскажем в другой статье.
Перед применением этого инструмента, особенно в продуктивных средах, важно знать некоторые его ограничения, причем очень важно иметь копию PL/SQL-кода и контроль его версии, прежде чем применять метод "обертывания" в нашем коде.

В основном, ограничения утилиты WRAP заключаются в следующем:

Зашифрованные файлы, в которых мы использовали wrap, не совместимы между выпусками Oracle .
Нельзя использовать wrap в коде триггеров.
Небезопасно для защиты паролей или имен таблиц.
Не обнаруживает синтаксические проблемы или ошибки кода, сгенерированные в нашем незашифрованном коде.
Запутываемый код длиннее оригинального.
Wrap запутывает только тело пакета или тип, но не его спецификацию.

Чтобы посмотреть, как это работает, создадим простую функцию, которую замаскируем с помощью wrap.

CREATE OR REPLACE FUNCTION dia_today_day RETURN VARCHAR2 AS
BEGIN
RETURN TO_CHAR(SYSDATE, 'DD-MON-YYYYYY HH24:MI:SS');
END dia_today;
/.

Проверяем корректность работы функции:


select today_day from dual;

today_day
-------
31-AUG-2023 20:47:53

Мы копируем код нашей функции в операционную систему.

[oracle u01]$ catfuncion_dia_de_hoy.sql
CREATE OR REPLACE FUNCTION dia_de_hoy RETURN VARCHAR2 AS
BEGIN
RETURN TO_CHAR(SYSDATE, ‘DD-MON-YYYY HH24:MI:SS’);
END dia_de_hoy;
/

Перед применением обфускации мы проверяем в SQL-Developer, что наша функция выглядит как обычно.

В операционной системе мы запускаем команду для обфускации кода PL-SQL.

La sintaxis es:
wrap iname=<fichero entrada> oname=<fichero de salida ofuscado>

[oracle u01]$ wrap iname=funcion_dia_de_hoy.sql oname=funcion_dia_de_hoy.out
PL/SQL Wrapper: Release 19.0.0.0.0 – Production on Thu Aug 31 21:17:23 2023
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle its affiliates. All rights reserved.
Processing funcion_dia_de_hoy.sql to funcion_dia_de_hoy.out

Утилита сообщит обфусцированный код для выполнения.

CREATE OR REPLACE FUNCTION dia_de_hoy wrapped
a000000
1
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
abcd
8
74 b6
LH4SgLm3AMbYAySR+WVH9QmeSoAwg8eZgcfLCNL+Xlr6WV+uofByhWTD58CyvbKbXufHdMAz
uHRlCbh0i8DAMv7ShgmpoQLOxtYaIazv1kx2hHEyjndMcfUQc3P17zdnr2pqhduXsevFV1RM
66tN+j1y6a+V638ZlSoZaiQl7Pumz30sVg==
/.

Скопируйте код и запустите его (SqlPlus, SqlDeveloper и т.д.).

С этого момента все новые сессии, подключающиеся к базе данных, не будут иметь доступа к коду в читаемом виде, а сам код будет скрыт от пользователей.

YouTube
LinkedIn