ExecEx

From SunFlurry wiki
Revision as of 11:06, 25 September 2023 by Admin (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
  ExecEx (Системные функции)
Объект:Функции общего назначения
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Невозможно превратить в строку или число, ошибка в выражении, ошибка при исполнении
Визуальность:Нет

Функция производит компиляцию и исполнение блока текста, заданного на внутреннем языке, или компилированной заранее функции в контролируемой среде исполнения. Аргументы могут ограничить возможности, предоставляемые исполняемому коду, как функционально (некоторые группы функций будут запрещены к использованию), или в заданных пределах доступа к переменным и функциям, так и с ограничением по времени исполнения или по выделяемой памяти. Функция может использоваться для исполнения кода, который может быть опасным или злонамеренным, либо кода из неизвестного источника. В отличие от функции Exec, текущая использует переменную Result внутри исполняемого кода, как результат выполнения функции, это может быть важно, если из кода запрещен доступ к любым внешним переменным, поэтому, нет простой возможности передать данные во внешнюю среду. Также см. функцию StandardOutputHook. Для онлайн демонстрации работы функции, см. следующую статью.

Синтаксис

ExecEx(<Блок для исполнения или компилированная функция (STRING, COMPILEDFUNCTION)>,<Установки ограничения исполнения (INT)>=0,<Ограничение по времени в мс. (INT)>=0,<Наименование функции, получающей выводимую в лог информацию (STRING)>,<Глубина поиска (INT)>=0,<Ограничение по использованию памяти потоком (INT)>=0):<Значение переменной Result при исполнении функции>

Аргументы

  • <Блок для исполнения (STRING)> - Произвольный блок инструкций, может содержать имена функций, переменных, операции, магические функции, особые конструкции, в т.ч. объявления новых функций. Ограничения на использование функций и доступу к переменным задается следующими аргументами. В случае, если аргумент является компилированной функцией (см. Compile), этап компиляции будет пропущен, однако на исполняемую компилированную функцию будут налагаться те же самые ограничения, как и на компилированный блок текста.
  • <Установки ограничения исполнения (INT)> - (необязательный аргумент) Аргумент задает ограничения доступа блока инструкций и является битовой маской. По умолчанию аргумент равен нулю (дополнительных запретов нет). Назначение битов аргумента следующее:
    • бит 0 (1) -- Запретить доступ ко всем переменным и функциям глобальных модулей. Программа может использовать только переменные и функции текущего модуля и экспортированные переменные и функции модулей, которые вызвали текущий. Внимание: функции, типа Publish могут не работать с такими ограничениями, если в них происходит вызов глобальных функций.
    • бит 1 (2) -- Запретить доступ ко всем переменным и функциям глобальных модулей и локального модуля. Программа не сможет получить доступ к любым внешним переменным или функциям, включая глобальные и локальные, так и созданные на текущем уровне исполнения. Внимание: функции, типа Publish могут не работать с такими ограничениями, если в них происходит вызов глобальных функций.
    • бит 2 (4) -- Запрещены любые функции диалога с пользователем (как функции, типа Box, так и вывод таблиц или текстов на экран, к примеру Show).
    • бит 3 (8) -- Запрещен доступ к функциям профилирования (ProfilerStart и подобным).
    • бит 4 (16) -- Запрещен доступ к функции прерывания исполнения Debugbreak.
    • бит 5 (32) -- Запрещен доступ к отладочным функциям (часто с префиксом dbg, примеру, dbgStackTrace).
    • бит 6 (64) -- Запрещен доступ к функциям остановки работы системы, перезапуска и подобным (к примеру, ExitProgram).
    • бит 7 (128) -- Запрещен доступ к функциям запуска исполняемых файлов (к примеру, SysExec).
    • бит 8 (256) -- Запрещен доступ к функциям семафора, в том числе к функции Mutex.ExecuteFunctionInSeparateThread (однако создание событий Mutex.CreateEvent не запрещено).
    • бит 9 (512) -- Запрещен доступ к функциям загрузки модулей, типа LoadModule или OpenObject.
    • бит 10 (1024) -- Запрещен доступ к функциям сохранения информации в файлы (в том числе в файлы на сервере базы данных), типа StringToFile, File.DeleteFile или Table.Save.
    • бит 11 (2048) -- Запрещен доступ к функциям чтения информации из файлов (в том числе из файлов на сервере базы данных), типа FileToString, File.FindOpen или Table.Save.
    • бит 12 (4096) -- Запрещен опасные функции буфера или записи, такие функции обычно оперируют абсолютными адресами системной памяти (к примеру, Buffer.SystemAddress или MemoryRecord.AssignToSystemMemory).
    • бит 13 (8192) -- Запрещено обращение к OLE-объектам.
    • бит 14 (16384) -- Запрещено обращение к любым IP функциям.
    • бит 15 (32768) -- Запрещено обращение к любым функциям дополнительных внешних баз данных (к примеру, ExternalDBase.Connect).
    • бит 16 (65536) -- Запрещено обращение к любым функциям загружаемой системной библиотеки.
    • бит 17 (131072) -- Запрещено обращение к системным функциям пересчета базы данных (которые обычно выполняются длительное время), к примеру DB.SysRecalcTotals.
    • бит 18 (262144) -- Запрещено обращение к визуальным функциям формы, включая функции типа Form.StatusText, Form.Close или Form.Destroy, но обращение к нейтральным функциям получения информации типа Form.IsFullyInitialized, Form.ToolMode или Form.Mode разрешено.
    • бит 19 (524288) -- Запрещено использование функций работы с картинками, также как и работы с функциями штрихкодов, типа Generate2DBarcode.
    • бит 20 (1048576) -- Запрещено использование функций, работающих с сервером, если эти функции можно использовать для нарушения работы сервера (к примеру, выполнить StoreGlobalTempString миллионы раз со случайными строками, с тем, чтобы заполнить память сервера).
  • <Ограничение по времени в мс. (INT)> - (необязательный аргумент) Аргумент задает ограничения по времени исполнения блока инструкций, заданном в миллисекундах. Если после истечения указанного времени, программа будет продолжать исполняться, будет вызвано исключение, которое невозможно будет подавить. Если аргумент не указан или равен нулю, ограничения задано не будет. Нужно также понимать, что программа может прерваться только после исполнения инструкции во время подготовки новой инструкции для исполнения. Если же, к примеру, функция OLE исполняется в течение долгого времени, исполнение не будет прервано до тех пор, пока она не закончит исполнение. Однако, функции ожидания, типа Sleep будут прерываться до окончания истечения периода ожидания.
  • <Наименование функции, получающей выводимую в лог информацию (STRING)> - (необязательный аргумент) Аргумент задает наименование особой функции, которая будет получать весь консольный вывод в виде строк с метками форматирования. Если эта функция задана, любой вывод информации в консоль клиента будет перенаправлен в вызовы данной функции (в консоль эта информация не попадет). Функция должна исполняться как можно быстрее, чтобы не задерживать исполнение кода ExecEx, любые исключения внутри функции будут игнорированы. На функцию не распространяется ограничения, накладываемые на исполняемый код ExecEx, однако время ее исполнения учитывается в ограничении времени исполнения кода ExecEx. В коде, для которого задана такая функция невозможно произвести вызов функции ExecEx с новой заданной функцией вывода (это позволяет избежать доступа из кода с ограничениями к среде без ограничений). Функция имеет следующий формат вызова <ФункцияПолученияЛога>(<Новый текст, выводящийся в лог (STRING)><Тип текста (INT)>,<Метки форматирования текста (STRING)>,<Параметр не используется>,<Список интерактивных объектов %LINK% (LIST)>). Ниже дано описание аргументов функции:
    • <Новый текст, выводящийся в лог (STRING)> - аргумент получает текстовую строку, которая была бы выведена в лог.
    • <Тип текста (INT)> - (необязательный аргумент) аргумент получает тип текстовой строки, доступны следующие типы:
      • -1 -- эта строка является сообщением об ошибке.
      • 0 -- эта строка является обычным текстом (созданным, к примеру функциями Message или Writeln).
      • 1 -- эта строка является текстом созданным функцией Message с типом текста "i".
      • 2 -- эта строка является текстом созданным функцией Message с типом текста ".".
      • 3 -- эта строка является текстом созданным функцией Message с типом текста "!".
      • 4 -- эта строка является текстом созданным функцией Message с типом текста "!!".
      • 5 -- эта строка является текстом созданным функцией Message с типом текста "!!!".
    • <Метки форматирования текста (STRING)> - (необязательный аргумент) аргумент получает строку с метками форматирования текста. Иногда это будет пустая строка, если весь текст представляет собой строку без форматирования. В случае, когда строка задана, она отдается в виде ANSI, каждый ее символ может быть превращен в байт и будет задавать форматирование соответствующего символа в строке текста лога. Доступны следующие значения символов форматирования:
      • 0 -- Текущий символ строки лога использует стандартный цвет и шрифт (не форматирован).
      • 1 -- Текущий символ строки лога использует такой же цвет и шрифт, как и предыдущий символ.
      • 2 -- Текущий символ строки лога использует цвет и шрифт, заданные семью последующими символами строки с метками форматирования. Эти последующие символы должны быть пропущены при подсчете индекса символа строки лога (относятся только к текущему символу) и имеют следующее назначение:
        • 3 символа задают цвет шрифта (формате RGB).
        • 3 символа задают цвет фона шрифта (формате RGB).
        • 1 символ задает формат шрифта, является битовой маской с битами: 0 (жирный шрифт), 1 (наклонный шрифт), 2 (подчеркнутый шрифт), 3 (зачеркнутый шрифт).
    • <Список интерактивных объектов %LINK% (LIST)> - (необязательный аргумент) аргумент получает список, хранящий все интерактивные объекты, переданные функции Message. Заголовками списка служат текстовые представления этих объектов, а объектами списка -- сами объекты, закодированные функцией ObjectToString.
  • <Глубина поиска (INT)> - (необязательный аргумент) Может принимать следующие значения:
    • 0 (по умолчанию) -- выполнять поиск функции во всех модулях большего уровня вложенности (родительских) и во всех глобальных модулях.
    • 1 -- выполнять поиск функции только внутри текущего модуля.
    • 2 -- выполнять поиск функции только внутри родительского модуля.
    • 3..x -- выполнять поиск функции только внутри родительского модуля указанного уровня (к примеру, для уровня 3, выполнять поиск только в родителе родителя текущего модуля).
  • <Ограничение по использованию памяти потоком (INT)> - (необязательный аргумент) (планируется к реализации).


Возвращаемое значение

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

Примеры

//тЗапрос -- строка с кодом для исполнения
//Функция исполняет ее с определенными ограничениями и временем исполнения не более 5 секунд.
//Информация, получаемая в лог, переводится в html формат отсылается на удаленный сервер с помощью функции ПослатьСтроку (здесь не дана).

  Function ПолучитьИПослатьСтроку(Стр,Тип,Стиль)
    //Расшифровка строки
    СтрРез:="";
    ФлДив:=0;
    i:=0;
    j:=0;
    While i<Length(Стиль) Do
      i:=i+1;
      j:=j+1;
      Симв:=Asc(Стиль[i]);
      If Симв=2 Then
        //<Color3Bytes><BGColor3Bytes><FontStyle1Byte>
        If ФлДив Then
          AppendStringToBufferedString(СтрРез,"</span>");
        EndIf;
      
        аЦвет:=Asc(Стиль[i+1])*65536+Asc(Стиль[i+2])*256+Asc(Стиль[i+3]);
        аЦвет2:=Asc(Стиль[i+4])*65536+Asc(Стиль[i+5])*256+Asc(Стиль[i+6]);
        Фл:=Asc(Стиль[i+7]);
      
        аСтиль:="";
        аСтиль:=аСтиль+?(аЦвет=0,"","color:#"+Lowercase(DecToHex(аЦвет,6)));
        аСтиль:=аСтиль+?(аЦвет2=0,"",?(аСтиль<>"","; ")+"background-color:#"+Lowercase(DecToHex(аЦвет2,6)));
        //bold(0),italic(1),underlined(2),strikeout(3)
        If Фл%2=1 Then
          аСтиль:=аСтиль+?(аСтиль<>"","; ")+"font-weight:bold";
        EndIf;
        If Фл\2%2=1 Then
          аСтиль:=аСтиль+?(аСтиль<>"","; ")+"font-style:italic";
        EndIf;
        If Фл\4%4<>0 Then
          аСтиль:=аСтиль+?(аСтиль<>"","; ")+"text-decoration:";
          If Фл\4%2<>0 Then
            аСтиль:=аСтиль+" underline";
          EndIf;
          If Фл\8%2<>0 Then
            аСтиль:=аСтиль+" line-through";
          EndIf;
        EndIf;
        i:=i+7;
        ФлДив:=0;
        if аСтиль<>"" Then
          AppendStringToBufferedString(СтрРез,"<span style="""+аСтиль+";"">");
          ФлДив:=1;
        EndIf;  
      ElseIf (Симв=0)And(ФлДив) Then
        AppendStringToBufferedString(СтрРез,"</span>");
        ФлДив:=0;
      EndIf;
      AppendStringToBufferedString(СтрРез,EncodeXMLString(Стр[j]));
    EndDo;
    If ФлДив Then
      AppendStringToBufferedString(СтрРез,"</span>");
    EndIf;
    AppendStringToBufferedString(СтрРез,Mid(Стр,j+1));
    ПослатьСтроку(СтрРез);
  EndFunction

Try
  ExecEx(тЗапрос,0b1111111111111111111,5000,"ПолучитьИПослатьСтроку");
Except
EndTry;