? Анимация и создание сайтов
Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 [ 111 ] 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

Выполнение в защищенном режиме

Обычно программы на языке Python имеют полный доступ к операционной системе через различные функции и объекты. Например, программа может открыть любой файл для чтения и записи с помощью встроенной функции open() (при условии, что у Вас достаточно полномочий). В большинстве случаев - это то, что Вам нужно.

С другой стороны, существует класс приложений, для которых такая "открытость" нежелательна. Представьте: Web-броузер (например, Grail) загружает код, написанный на языке Python, с различных адресов в Internet и выполняет его на локальной машине. Так как автор кода неизвестен, очевидно, что Вы не можете доверить ему все ресурсы своей машины.

При выполнении кода в защищенном режиме (restricted execution) происходит разделение потенциально опасного кода и безопасного кода. Идея состоит в создании "надсмотрщиком" окружения с ограниченными полномочиями и выполнении в нем кода, которому Вы не доверяете. Заметим, что код, выполняемый в таком окружении, может создать новое окружения с меньшими (но не большими) полномочиями.

Особенность модели защищенного режима в языке Python состоит в том, что интерфейс, представленный потенциально опасному коду, обычно такой же, как и в обычном режиме. Таким образом, нет необходимости в изучении каких-либо особенностей для написания кода, который будет выполняться в защищенном режиме. Так как окружение для защищенного режима создается "надсмотрщиком", Вы можете накладывать различные ограничения в зависимости от назначения приложения. Например, в определенной ситуации Вы можете посчитать безопасным чтение файлов в определенном каталоге, но не запись в них. В этом случае "надсмотрщик" может переопределить встроенную функцию open() таким образом, чтобы она генерировала исключение IOError, если открываемый файл находится за пределами разрешенного каталога или файл открывается для записи.

Интерпретатор языка Python для каждого блока проверяет переменную builtins и, если она не является ссылкой на встроенный модуль builtin или словарь, представляющий пространство его имен, считает, что блок кода выполняется в защищенном режиме. В защищенном режиме действуют некоторые ограничения, которые не позволяют программе выйти из окружения с ограниченными полномочиями. Например, становятся недоступными атрибут функций func globals и атрибут классов и экземпляров dict .

Следующие два модуля предоставляют средства для настройки окружения защищенного режима:



26.1. rexec - основные средства настройки защищенного режима 351

rexec Основные средства настройки защищенного режима. Bastion Ограничивает доступ к экземпляру класса.

26.1 rexec - основные средства настройки защищенного режима

Этот модуль определяет класс RExec, предоставляющий методы r eval(), r execfile() , r exec() и r import() , являющиеся ограниченными версиями встроенных функций eval() и execfile() и инструкций exec и import. Код, выполняемый в созданном этим классом окружении, имеет доступ только к модулям и функциям, которые считаются безопасными. Вы можете определить производный от RExec класс, если необходимо добавить или убрать какие-либо возможности.

Заметим, что класс RExec предотвращает использование кодом опасных операций (например, чтение и запись файлов или использование сетевых соединений), но не может защитить от использования слишком большого количества памяти или процессорного времени.

RExec ([hooks [, verbose]])

Создает и возвращает объект, предоставляющий окружение с ограниченными возможностями. Аргумент hooks должен быть экземпляром RHooks (в настоящий момент не документирован) или производного от него класса, который реализует загрузку модулей. Если аргумент hooks опущен или равен None, автоматически создается новый экземпляр (используются аргументы по умолчанию). Если задан и является истиной аргумент verbose, на стандартный поток вывода будет выводиться отладочная информация.

Используя альтернативный объект в качестве аргумента hooks, Вы можете обеспечить переадресацию запросов к файловой системе через механизм RPC (Remote Procedure Call) или реализовать загрузку модулей с определенного URL (как это сделано в браузере Grail).

Класс RExec имеет следующие атрибуты, которые используются при создании экземпляра. Присваивание новых значений одноименным атрибутам экземпляра не окажет никакого влияния. Присваивание следует проводить атрибутам производного класса в его определении (но не в конструкторе). Все эти атрибуты являются кортежами из строк.

nok builtin names

Имена встроенных функций, которые не будут доступны в защищенном режиме. Для класса RExec это (open, reload, import ) . Добавлять имена в производных классах следует следующим способом:



352 Глава 26. Выполнение в защищенном режиме

class MyRExec(RExec):

nok builtin names = RExec.nok builtin names +

Это позволит избежать неприятностей, если в будущих версиях языка будут добавлены новые опасные функции.

ok builtin modules

Имена встроенных и динамически подгружаемых модулей, использование которых безопасно. Для класса RExec это (audioop, array, binascii, cmath, errno, imageop, marshal, math, md5, operator, parser, regex, pcre, rotor, select, strop, struct, time).

ok path

Каталоги, в которых будет производиться поиск модулей при импортировании в защищенном режиме. Для класса RExec берется значение sys.path на момент инициализации модуля rexec.

ok posix names

Имена, определенные в модуле os, которые будут доступны в защищенном режиме. Для класса RExec это (error, fstat, listdir, lstat, readlink, stat, times, uname, getpid, getppid, getcwd, getuid, getgid, geteuid, getegid).

ok sys names

Имена, определенные в модуле sys, которые будут доступны в защищенном режиме. Для класса RExec это(ps1, ps2, copyright, version, platform, exit, maxint).

Экземпляры класса RExec поддерживают следующие методы. Отличие методов с приставками r и s состоит в том, что последние после выполнения кода восстанавливают исходные значения переменных sys.stdin, sys.stderr и sys.stdout в созданном окружении.

r eval( code) s eval( code)

Вычисляет и возвращает значение выражения языка Python, представленного строкой или объектом кода code. Вычисление производится в модуле main созданного окружения.

r exec(code) s exec( code)

Выполняет в модуле main созданного окружения инструкции языка Python, представленные строкой или объектом кода code.



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 [ 111 ] 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145