Иногда возникает необходимость скрыть (обфусцировать) исходный код PL/SQL. Использовать эту утилиту нужно с умом, речь идет не о сокрытии всего доступного кода, а только того, который по соображениям безопасности не должен быть передан третьим лицам.
Традиционно этот метод используется с помощью инструмента WRAP, о котором мы подробно рассказываем в этой статье, а начиная с версии 10g R2, это действие можно выполнить с помощью пакета DBMS_DDL.WRAP, о котором мы расскажем в другой статье.
Перед применением этого метода, особенно в продуктивных средах, важно знать некоторые его ограничения, поэтому очень важно иметь копию PL/SQL-кода и контроль его версии перед применением метода "обертывания" в нашем коде.
В основном, ограничения утилиты WRAP заключаются в следующем:
Обфусцированные файлы, в которых мы использовали wrap, не совместимы между версиями Oracle Databases.
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@oracleconraul u01]$ cat función_dia_de_hoy.sql
CREATE OR REPLACE FUNCTION dia_de_hoy RETURN VARCHAR2 AS
BEGIN
RETURN TO_CHAR(SYSDATE, 'DD-MON-YYY HH24:MI:SS');
END dia_de_hoy;
/.
В SQL-Developer мы видим нормальный вид функции до применения обфускации.
В операционной системе мы запускаем команду для обфускации кода PL-SQL.
La sintaxis es:
wrap iname=<fichero entrada> oname=<fichero de salida ofuscado>
[oracle@localhost 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.0
Copyright (c) 1982, 2019, Oracle и/или ее аффилированные лица. Все права защищены.
Обработка файла today_day_function.sql в файл today_day_function.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 и т.д.).
С этого момента все новые сессии, подключающиеся к базе данных, не будут иметь доступа к коду в читаемом виде, а сам код будет скрыт от пользователей.