Как получить доступ к AST (абстрактному синтаксическому дереву) для хранимой процедуры PL/SQL?

Когда Oracle компилирует хранимую процедуру, он сохраняет AST для процедуры в формате DIANA.

  • Как я могу получить доступ к этому AST?
  • Существуют ли встроенные инструменты для обработки этого АСТ?

Ответы

Ответ 1

Существует недокументированный пакет DUMPDIANA, предназначенный для сброса Дианы в удобочитаемом формате.

Файл $ORACLE_HOME\rdbms\admin\dumpdian.sql говорит: "Документация доступна в /vobs/plsql/notes/dumpdiana.txt". Я не могу найти этот файл, и без него мы можем только догадываться о значении некоторых параметров. Основное использование DUMPDIANA заключается в следующем:

SQL> show user
USER is "SYS"
SQL> @?\rdbms\admin\dumpdian

Library created.


Package created.


Package body created.

create or replace procedure hello_world
  2  as
  3  begin
  4  dbms_output.put_line('hello world');
  5* end;


Procedure created.

SQL> set serveroutput on
SQL> execute sys.DUMPDIANA.dump('HELLO_WORLD');
user: SYS

PL/SQL procedure successfully completed.

В этот момент в папке должно быть создано пару файлов $ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace. Кажется, что эти два файла соответствуют именованию:

orcl12c_ora_{PROCESS}.trc
orcl12c_ora_{PROCESS.trm

Если файл trc является доступной для пользователя версией соответствующего trm файла, а {PROCESS} является идентификатором процесса операционной системы. Чтобы найти это, используйте следующий запрос из того же сеанса:

select p.spid from v$session s,v$process p 
where s.paddr = p.addr
and s.sid = sys_context('USERENV','SID');

Например, если идентификатор сеанса был 8861, то из оболочки bash вы можете просмотреть результаты, используя:

vim $ORACLE_BASE/diag/rdbms/orcl12c/orcl12c/trace/orcl12c_ora_8861.trc

Результат интересен... если не особенно интуитивно! Например, здесь приведен фрагмент созданного файла. Обратите внимание на строковый литерал HELLO_WORLD.

PD1(2):D_COMP_U  [
    L_SRCPOS : row 1 col 1
    A_CONTEX :
PD2(2):      D_CONTEX  [
          L_SRCPOS : row 1 col 1
          AS_LIST :  < >
      ]
    A_UNIT_B :
PD3(2):      D_S_BODY  [
          L_SRCPOS : row 1 col 1
          A_D_ :
PD4(2):            DI_PROC  [
                L_SRCPOS : row 1 col 11
                L_SYMREP : HELLO_WORLD,
                S_SPEC : PD5^(2),
                S_BODY : PD8^(2),

Несколько заметок. Я запускаю это как SYS, который, как мы знаем, не является хорошей практикой, я не знаю, почему вы не должны предоставлять привилегии DUMPDIANA обычным пользователям. Все процедуры, которые вы запускаете, входят в один и тот же файл - если вы удалите этот файл, он перестает работать, и вам нужно будет начать новый сеанс. Если он перестает работать, запуск нового сеанса иногда, кажется, устраняет проблему.

Ответ 2

Вот отличный учебник по DIANA и IDL в PDF Как развернуть PL/SQL, Пит Финниган, главный консультант Siemens на время написания, специализирующееся на исследовании и обеспечении безопасности баз данных Oracle.

Среди других очень интересных вещей вы узнаете, что:

  • DIANA записывается как IDL (язык определения интерфейса).
  • В четырех таблицах IDL хранится (IDL_CHAR $, IDL_SB4 $, IDL_UB1 $и IDL_UB2 $)
  • Wrapper PL/SQL - это просто DIANA, записанный как IDL.
  • Dumpdiana не установлен по умолчанию, вам необходимо также установить пакеты DIANA, PIDL и DIUTIL PL/SQL, и вам нужно запустить его как SYS.
  • Как сбросить дерево DIANA и понять его.
  • Как восстановить источник PL/SQL от DIANA.
  • Как написать un-wrapper PL/SQL.
  • Ограничения не-оболочки оболочки на основе PL/SQL.
  • Ограничения самого API PL/SQL.
  • Как перечислить узлы и атрибуты DIANA.
  • Доказательство концепции un-wrapper.

Вы можете найти его сайт здесь. Там столько контента. Вы найдете потрясающие статьи о безопасности Oracle, а также много полезных инструментов безопасности разработан не только им, но и другим авторам.

Лучше всего, вы можете связаться с ним, если после чтения у вас остались вопросы.