2018-02-05 17:22:04 +03:00
|
|
|
|
<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Safe Tcl</title>
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
<body>
|
|
|
|
|
<h1>Safe Tcl</h1>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Механизм создания и управления безопасными
|
|
|
|
|
интерпретаторами.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=СИНТАКСИС></a>СИНТАКСИС</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<a href=#safe::interpCreate>::safe::interpCreate</a> ?<em>slave</em>? ?<em>options</em>...?
|
|
|
|
|
<a href=#safe::interpInit>::safe::interpInit</a> <em>slave</em> ?<em>options</em>...?
|
|
|
|
|
<a href=#safe::interpConfigure>::safe::interpConfigure</a> <em>slave</em> ?<em>options</em>...?
|
|
|
|
|
<a href=#safe::interpDelete>::safe::interpDelete</a> <em>slave</em>
|
|
|
|
|
<a href=#safe::interpAddToAccessPath>::safe::interpAddToAccessPath</a> <em>slave</em> <em>directory</em>
|
|
|
|
|
<a href=#safe::interpFindInAccessPath>::safe::interpFindInAccessPath</a> <em>slave</em> <em>directory</em>
|
|
|
|
|
<a href=#safe::setLogCmd>::safe::setLogCmd</a> ?<em>cmd</em> <em>arg</em>...?
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</pre>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=ОПИСАНИЕ></a>ОПИСАНИЕ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p><strong>Safe Tcl</strong> - это механизм безопасного исполнения
|
|
|
|
|
ненадежных Tcl скриптов и предоставления этим скриптам
|
|
|
|
|
опосредованного доступа к потенциально опасным функциям.</p>
|
|
|
|
|
|
|
|
|
|
<p><strong>Safe Tcl</strong> служит для того, чтобы ненадежные скрипты не
|
|
|
|
|
смогли нарушить работу вызывающего их приложения: он
|
|
|
|
|
предотвращает покушения на несанкционированный доступ к
|
|
|
|
|
информации и нарушение целостности вызывающего этот скрипт
|
|
|
|
|
процесса.</p>
|
|
|
|
|
|
|
|
|
|
<p><strong>Safe Tcl</strong> позволяет интерпретатору-предку
|
|
|
|
|
создавать безопасные интерпретаторы с ограниченными
|
|
|
|
|
возможностями, в которых содержится набор предопределенных
|
|
|
|
|
синонимов для команд <a
|
|
|
|
|
href=source.html><strong>source</strong></a>, <a
|
|
|
|
|
href=load.html><strong>load</strong></a>, <a
|
|
|
|
|
href=file.html><strong>file</strong></a> и <a
|
|
|
|
|
href=exit.html><strong>exit</strong></a> и сохраняются
|
|
|
|
|
возможности автозагрузки команд и пакетов.</p>
|
|
|
|
|
|
|
|
|
|
<p>Безопасный интерпретатор не позволяет получить какую-либо
|
|
|
|
|
информацию о структуре файловой системы, поскольку для доступа к
|
|
|
|
|
файлам в безопасном интерпретаторе используются специальные
|
|
|
|
|
метки. Когда безопасный интерпретатор запрашивает доступ к
|
|
|
|
|
файлу, он использует метку как часть виртуального имени файла.
|
|
|
|
|
Родительский интерпретатор заменяет метку на реальное имя
|
|
|
|
|
каталога и выполняет требуемую операцию с файлом. С помощью
|
|
|
|
|
опций команд, описанных ниже, можно выбрать требуемый уровень
|
|
|
|
|
безопасности интерпретатора.</p>
|
|
|
|
|
|
|
|
|
|
<p>Все команды для работы с безопасными интерпретаторами
|
|
|
|
|
содержатся в пространстве имен safe. Команда <a href=
|
|
|
|
|
#safe::interpCreate><strong>::safe::interpCreate</strong></a>
|
|
|
|
|
создает безопасный интерпретатор. Возможные опции команды
|
|
|
|
|
описаны ниже, см. "<a href=#ОПЦИИ>Опции</a>".</p>
|
|
|
|
|
|
|
|
|
|
<p>Команда возвращает имя созданного интерпретатора. Команда <a
|
|
|
|
|
href=#safe::interpInit><strong>::safe::interpInit</strong></a>
|
|
|
|
|
аналогична, но ее первым аргументом должно быть имя
|
|
|
|
|
интерпретатора, созданного с помощью команды <a href=
|
|
|
|
|
interp.html><strong>interp</strong></a>. Команда <a href=
|
|
|
|
|
#safe::interpDelete><strong>::safe::interpDelete</strong></a>
|
|
|
|
|
удаляет интерпретатор, имя которого использовано в качестве
|
|
|
|
|
аргумента. Команда <a href=#safe::interpConfigure
|
|
|
|
|
><strong>::safe::interpConfigure</strong></a> позволяет задать
|
|
|
|
|
опции для безопасного интерпретатора или получить информацию
|
|
|
|
|
об заданных ранее опциях. Подробно опции описаны ниже
|
|
|
|
|
(см. "<a href=#ОПЦИИ>Опции</a>").</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Для каждого безопасного интерпретатора, созданного с помощью
|
|
|
|
|
команды <a
|
|
|
|
|
href=#safe::interpCreate><strong>::safe::interpCreate</strong></a>
|
|
|
|
|
или инициированного с помощью команды <a
|
|
|
|
|
href=#safe::interpInit><strong>::safe::interpInit</strong></a>
|
|
|
|
|
в родительском интерпретаторе создается список доступных
|
|
|
|
|
каталогов - виртуальный путь. Каждый каталог в пути связывается
|
|
|
|
|
с реальным каталогом локальной файловой системы и с меткой,
|
|
|
|
|
доступной в безопасном интерпретаторе. В результате надежный
|
|
|
|
|
интерпретатор обходится без сведений о реальной файловой системе
|
|
|
|
|
на машине, на которой исполняется интерпретатор. Когда в
|
|
|
|
|
надежном интерпретаторе используется метка для доступа к
|
|
|
|
|
конкретному файлу (например, для выполнения команды <a
|
|
|
|
|
href=source.html><strong>source</strong></a> или <a
|
|
|
|
|
href=load.html><strong>load</strong></a>), метка заменяется в
|
|
|
|
|
родительском интерпретаторе на настоящее имя каталога и
|
|
|
|
|
необходимый файл ищется в файловой системе. Надежный
|
|
|
|
|
интерпретатор не получает сведений о реальном имени файла в
|
|
|
|
|
файловой системе. Для работы с виртуальными именами файлов
|
|
|
|
|
предусмотрены специальные команды. Команда <a href=
|
|
|
|
|
#safe::interpConfigure><strong>::safe::interpConfigure</strong></a>
|
|
|
|
|
позволяет задавать новый виртуальный путь для интерпретатора.
|
|
|
|
|
Команда <a href=#safe::interpAddToAccessPath
|
|
|
|
|
><strong>::safe::interpAddToAccessPath</strong></a> позволяет
|
|
|
|
|
добавлять каталоги к виртуальному пути указанного безопасного
|
|
|
|
|
интерпретатора. Команда <a href=#safe::interpFindInAccessPath
|
|
|
|
|
><strong>::safe::interpFindInAccessPath</strong></a> позволяет
|
|
|
|
|
найти каталог в виртуальном пути для безопасного интерпретатора
|
|
|
|
|
и получить его метку. Если каталог не найден, выдается сообщение
|
|
|
|
|
об ошибке.</p>
|
|
|
|
|
|
|
|
|
|
<p>Команда <a href=#safe::setLogCmd
|
|
|
|
|
><strong>::safe::setLogCommand</strong></a> позволяет задать
|
|
|
|
|
скрипт, который выполняется при каждом событии в безопасном
|
|
|
|
|
интерпретаторе. Этот скрипт вызывается с одним аргументом -
|
|
|
|
|
строкой, содержащей описание события.</p>
|
|
|
|
|
|
|
|
|
|
<h2><a name=СИНОНИМЫ></a>СИНОНИМЫ</h2>
|
|
|
|
|
|
|
|
|
|
<p>При создании безопасного интерпретатора в нем определяются
|
|
|
|
|
следующие команды - синонимы:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><strong>source</strong> <em>fileName</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Аналогична команде <a
|
|
|
|
|
href=source.html><strong>source</strong></a>, однако
|
|
|
|
|
позволяет работать только с файлами в виртуальном пути
|
|
|
|
|
безопасного интерпретатора. Имя файла <em>fileName</em> должно
|
|
|
|
|
содержать одну из меток, определенных для каталогов в
|
|
|
|
|
виртуальном пути. Допустимые имена файлов более подробно
|
|
|
|
|
описаны ниже (см. "<a
|
|
|
|
|
href=#БЕЗОПАСНОСТЬ>Безопасность</a>").
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>load</strong> <em>fileName</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Требуемый файл (обычно, объектный файл из разделяемой
|
|
|
|
|
библиотеки) загружается в безопасный интерпретатор, если его
|
|
|
|
|
удается найти. Имя файла должно содержать одну из меток для
|
|
|
|
|
каталогов виртуального пути. Кроме того, разделяемый объектный
|
|
|
|
|
файл должен содержать безопасную точку входа. Подробности
|
|
|
|
|
приведены в описании команды
|
|
|
|
|
<a href=load.html><strong>load</strong></a>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>file</strong> ?<em>options</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Синоним команды <a href=file.html><strong>file</strong></a> содержит
|
|
|
|
|
только безопасные подкоманды обычной команды <a href=
|
|
|
|
|
file.html><strong>file</strong></a>, а именно: <a
|
|
|
|
|
href=file.html#dirname><strong>dirname</strong></a>,
|
|
|
|
|
<a href=file.html#join><strong>join</strong></a>,
|
|
|
|
|
<a href=file.html#extension><strong>extension</strong></a>,
|
|
|
|
|
<a href=file.html#rootname><strong>root</strong></a>,
|
|
|
|
|
<a href=file.html#tail><strong>tail</strong></a>,
|
|
|
|
|
<a href=file.html#pathname><strong>pathname</strong></a> и
|
|
|
|
|
<a href=file.html#split><strong>split</strong></a>.
|
|
|
|
|
Назначение подкоманд приведено в
|
|
|
|
|
описании команды <a href=file.html><strong>file</strong></a>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>exit</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>При выполнении команды безопасный
|
|
|
|
|
интерпретатор удаляется, вычисления в нем прерываются, но
|
|
|
|
|
родительский интерпретатор продолжает существовать.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=КОМАНДЫ></a>КОМАНДЫ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>В родительском интерпретаторе для работы с безопасными
|
|
|
|
|
интерпретаторами предусмотрены следующие команды:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dl>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=safe::interpCreate></a><strong>::safe::interpCreate</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
?<em>slave</em>? ?<em>options</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Создает безопасный интерпретатор, инициализирует в нем
|
|
|
|
|
команды - синонимы, описанные выше, и механизмы автозагрузки
|
|
|
|
|
команд и пакетов в соответствии с заданными опциями
|
|
|
|
|
(см. "<a href=#ОПЦИИ>Опции</a>"). Если аргумент
|
|
|
|
|
slave отсутствует, имя интерпретатора формируется
|
|
|
|
|
автоматически. Команда всегда возвращает имя созданного
|
|
|
|
|
интерпретатора.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=safe::interpInit></a><strong>::safe::interpInit</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>slave</em> ?<em>options</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Команда аналогична предыдущей, однако интерпретатор должен
|
|
|
|
|
быть уже создан каким-либо иным способом, например с помощью
|
|
|
|
|
команды <strong>::interp create-safe</strong>.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><a
|
2018-02-05 17:22:04 +03:00
|
|
|
|
name=safe::interpConfigure></a><strong>::safe::interpConfigure</strong>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<em>slave</em> ?<em>options</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Если опции не заданы, возвращает значения всех опций для
|
|
|
|
|
указанного безопасного интерпретатора. В противном случае
|
|
|
|
|
устанавливает указанные значения опций (подробнее см. "<a
|
|
|
|
|
href=#ОПЦИИ>Опции</a>").
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=safe::interpDelete>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</a><strong>::safe::interpDelete</strong> <em>slave</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Удаляет безопасный интерпретатор и
|
|
|
|
|
вычищает в родительском интерпретаторе информацию о нем. Перед
|
|
|
|
|
удалением выполняется скрипт, заданный с помощью опции <strong>
|
|
|
|
|
-deletehook</strong>, если он был задан. К скрипту добавляется
|
|
|
|
|
дополнительный аргумент - имя удаляемого интерпретатора.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=safe::interpFindInAccessPath>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</a><strong>::safe::interpFindInAccessPath</strong> <em>slave</em>
|
|
|
|
|
<em>directory</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Команда возвращает метку, которую можно использовать в
|
|
|
|
|
безопасном интерпретаторе для каталога <em>directory</em>. Если
|
|
|
|
|
в виртуальном пути нет такого каталога, возвращается сообщение
|
|
|
|
|
об ошибке. Пример использования команды:
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
###Создание безопасного интерпретатора
|
2015-10-19 13:27:31 +03:00
|
|
|
|
::safe::interpCreate qqq
|
2018-02-05 17:22:04 +03:00
|
|
|
|
###Присваивание переменной tk_library метки соответствующего каталога
|
|
|
|
|
qqq eval [list set tk_library [::safe::interpFindInAccessPath qqq ]]
|
|
|
|
|
###Выполнение команды source в безопасном интерпретаторе
|
|
|
|
|
qqq eval source $tk_library/msgbox.tcl
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</pre>
|
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=safe::interpAddToAccessPath>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</a><strong>::safe::interpAddToAccessPath</strong> <em>slave</em>
|
|
|
|
|
<em>directory</em></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd> Команда позволяет добавить к виртуальному пути указанного
|
|
|
|
|
безопасного интерпретатора каталог <em>directory</em>. Команда
|
|
|
|
|
возвращает значение метки для каталога <em> directory</em>. Если
|
|
|
|
|
каталог уже содержался в виртуальном пути, команда только
|
|
|
|
|
возвращает его метку и не добавляет его в виртуальный
|
|
|
|
|
путь. Пример использования команды (см. пример к предыдущей
|
|
|
|
|
команде):
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
::safe::interpAddToAccessPath qqq
|
|
|
|
|
qqq eval source $my_lib/$my_file
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</pre>
|
|
|
|
|
</dd>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dt><a name=safe::setLogCmd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</a><strong>::safe::setLogCmd</strong> ?<em>cmd</em> <em>arg</em>...?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd><p>Эта команда позволяет задать скрипт, который будет
|
|
|
|
|
выполняться при различных событиях, связанных с безопасными
|
|
|
|
|
интерпретаторами. Если команда вызвана без аргументов, то
|
|
|
|
|
она возвращает установленный ранее скрипт. Вызванная с одним
|
|
|
|
|
аргументом - пустой строкой - команда удаляет установленный
|
|
|
|
|
ранее скрипт и отменяет процесс журнализации. Установленный
|
|
|
|
|
скрипт выполняется с одним дополнительным аргументом -
|
|
|
|
|
строкой, описывающей событие. Основное назначение команды -
|
|
|
|
|
использование при отладке скриптов, выполняемых в безопасных
|
|
|
|
|
интерпретаторах. Используя ее, вы сможете получить полную
|
|
|
|
|
информацию об ошибке, в то время как безопасный
|
|
|
|
|
интерпретатор возвращает только обобщенное сообщение об
|
|
|
|
|
ошибке (это позволяет избежать разглашения в сообщении об
|
|
|
|
|
ошибке конфиденциальной информации, например, о реальных
|
|
|
|
|
именах файлов). Пример использования:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
::safe::setLogCmd puts stderr
|
|
|
|
|
</pre>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Ниже приведен журнал сессии, в которой безопасный
|
|
|
|
|
интерпретатор пытается прочитать файл, который не найден в
|
|
|
|
|
виртуальном пути. Обратите внимание, что сам безопасный
|
|
|
|
|
интерпретатор получает при этом только сообщение о том, что
|
|
|
|
|
файл не найден:</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<pre>
|
|
|
|
|
NOTICE for slave interp10 : Created
|
|
|
|
|
NOTICE for slave interp10 : Setting accessPath=(/foo/bar)
|
|
|
|
|
staticsok=1 nestedok=0 deletehook=()
|
|
|
|
|
NOTICE for slave interp10 : auto_path in interp10 has been
|
2018-02-05 17:22:04 +03:00
|
|
|
|
set to {(:0:)}
|
2015-10-19 13:27:31 +03:00
|
|
|
|
ERROR for slave interp10 : /foo/bar/init.tcl: no such file
|
|
|
|
|
or directory
|
|
|
|
|
</pre>
|
|
|
|
|
</dd>
|
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=ОПЦИИ></a>ОПЦИИ</h2>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p>Для команд <strong>::safe::interpCreate</strong>,
|
|
|
|
|
<strong>::safe::interpInit</strong>, и <strong>:safe::interpConfigure</strong>
|
|
|
|
|
определены перечисленные ниже опции. Имена опций могут быть
|
|
|
|
|
сокращены до минимальных однозначных имен. Имена опций не
|
|
|
|
|
чувствительны к регистру, в котором они набраны.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dl>
|
|
|
|
|
<dt><strong>-accessPath</strong> ?<em>directoryList</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Опция задает список каталогов, к которым может иметь доступ
|
|
|
|
|
безопасный интерпретатор, и возвращает метки соответствующих
|
|
|
|
|
каталогов. Если список не задан или если он пуст, безопасный
|
|
|
|
|
интерпретатор получает доступ к каталогам, используемым для
|
|
|
|
|
автозагрузки в родительском интерпретаторе. Подробнее
|
|
|
|
|
см. "<a href=#БЕЗОПАСНОСТЬ>Безопасность</a>".</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
|
|
|
|
<dt><strong>-noStatics</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Если эта опция задана, то не допускается загрузка статически
|
|
|
|
|
связанных пакетов (как <strong>load {} Tk</strong>). По умолчанию
|
|
|
|
|
загрузка таких пакетов разрешена.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>-nestedLoadOk</strong></dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Если эта опция задана, безопасный интерпретатор может
|
|
|
|
|
загружать пакеты в собственные подинтерпретаторы. По умолчанию
|
|
|
|
|
загрузка пакетов в подинтерпретаторы запрещена.
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dd>
|
|
|
|
|
|
|
|
|
|
<dt><strong>-deleteHook</strong> ?<em>script</em>?</dt>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<dd>Если скрипт задан, он выполняется в родительском
|
|
|
|
|
интерпретаторе (с дополнительным аргументом - именем
|
|
|
|
|
безопасного интерпретатора) перед удалением безопасного
|
|
|
|
|
интерпретатора. Если скрипт не задан, то удаляется заданный
|
|
|
|
|
ранее скрипт (если такой был) и никаких дополнительных
|
|
|
|
|
действий перед удалением безопасного интерпретатора не
|
|
|
|
|
производится. По умолчанию скрипт не задан.</dd>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</dl>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<h2><a name=БЕЗОПАСНОСТЬ></a>БЕЗОПАСНОСТЬ</h2>
|
|
|
|
|
|
|
|
|
|
<p>Save Tcl не дает полной гарантии безопасности. В частности, он
|
|
|
|
|
не защищает от атак на сервер, когда поглощаются все ресурсы
|
|
|
|
|
процессора и пользователь не может использовать компьютер для
|
|
|
|
|
полезной работы. Однако такие атаки считаются, как правило,
|
|
|
|
|
менее опасными, чем несанкционированный доступ к информации и
|
|
|
|
|
нарушение целостности, от которых безопасный интерпретатор
|
|
|
|
|
защищает. В безопасном интерпретаторе, помимо безопасного набора
|
|
|
|
|
команд, который описан в описании команды <a href=
|
|
|
|
|
interp.html><strong>interp</strong></a>, имеются синонимы для команд <a
|
|
|
|
|
href=source.html><strong>source</strong></a>, <a
|
|
|
|
|
href=load.html><strong>load</strong></a>, <a
|
|
|
|
|
href=exit.html><strong>exit</strong></a> и безопасное подмножество
|
|
|
|
|
подкоманд команды <a href=file.html><strong>file</strong></a>. В
|
|
|
|
|
безопасном интерпретаторе возможна автозагрузка библиотек и
|
|
|
|
|
пакетов. Поскольку эти команды имеют дело с локальной файловой
|
|
|
|
|
системой, существует потенциальная опасность использования их
|
|
|
|
|
для доступа к конфиденциальной информации. Чтобы предотвратить
|
|
|
|
|
эту возможность, в безопасном интерпретаторе используются не
|
|
|
|
|
настоящие имена каталогов, а специальные метки. Эти метки
|
|
|
|
|
транслируются в реальные имена файлов только в родительском
|
|
|
|
|
интерпретаторе.</p>
|
|
|
|
|
|
|
|
|
|
<p>Чтобы исключить доступ к файлам, которые оказались в силу тех
|
|
|
|
|
или иных причин в разрешенных для чтения в безопасном
|
|
|
|
|
интерпретаторе каталогах, синоним команды <a
|
|
|
|
|
href=source.html><strong>source</strong></a> обеспечивает
|
|
|
|
|
доступ только к файлам с расширением tcl, в именах которых
|
|
|
|
|
содержится ровно одна точка, а общая длина имени не превышает
|
|
|
|
|
четырнадцати символов.</p>
|
|
|
|
|
|
|
|
|
|
<p>По умолчанию в Tcl переменной <em>auto_path</em> содержатся метки
|
|
|
|
|
для каталогов, содержащихся в аналогичной переменной в
|
|
|
|
|
родительском интерпретаторе и их непосредственных подкаталогов.
|
|
|
|
|
Первая метка в списке присваивается также Tcl переменной
|
|
|
|
|
<em>tcl_library</em> безопасного интерпретатора. Вы можете
|
|
|
|
|
сократить этот список, в явном виде задав доступные каталоги для
|
|
|
|
|
безопасного интерпретатора с помощью опции
|
2015-10-19 13:27:31 +03:00
|
|
|
|
<strong>-accessPath.</strong></p>
|
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p><strong>Safe Tcl</strong> - это механизм безопасного исполнения
|
|
|
|
|
ненадежных Tcl скриптов и предоставления этим скриптам
|
|
|
|
|
опосредованного доступа к потенциально опасным функциям.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
|
2018-02-05 17:22:04 +03:00
|
|
|
|
<p><strong>Safe Tcl</strong> служит для того, чтобы ненадежные скрипты не
|
|
|
|
|
смогли нарушить работу вызывающего их приложения: он
|
|
|
|
|
предотвращает покушения на несанкционированный доступ к
|
|
|
|
|
информации и нарушение целостности вызывающего этот скрипт
|
|
|
|
|
процесса.</p>
|
|
|
|
|
|
|
|
|
|
<p><strong>Safe Tcl</strong> позволяет интерпретатору-предку создавать
|
|
|
|
|
безопасные интерпретаторы с ограниченными возможностями, в
|
|
|
|
|
которых содержится набор предопределенных синонимов для команд
|
|
|
|
|
<a href=source.html><strong>source</strong></a>, <a
|
|
|
|
|
href=load.html><strong>load</strong></a>, <a
|
|
|
|
|
href=file.html><strong>file</strong></a> и <a
|
|
|
|
|
href=exit.html><strong>exit</strong></a> и сохраняются возможности
|
|
|
|
|
автозагрузки команд и пакетов.</p>
|
|
|
|
|
|
|
|
|
|
<p>Безопасный интерпретатор не позволяет получить какую-либо
|
|
|
|
|
информацию о структуре файловой системы, поскольку для доступа к
|
|
|
|
|
файлам в безопасном интерпретаторе используются специальные
|
|
|
|
|
метки. Когда безопасный интерпретатор запрашивает доступ к
|
|
|
|
|
файлу, он использует метку как часть виртуального имени файла.
|
|
|
|
|
Родительский интерпретатор заменяет метку на реальное имя
|
|
|
|
|
каталога и выполняет требуемую операцию с файлом. С помощью
|
|
|
|
|
опций команд, описанных ниже, можно выбрать требуемый уровень
|
|
|
|
|
безопасности интерпретатора.</p>
|
|
|
|
|
|
|
|
|
|
<p>Все команды для работы с безопасными интерпретаторами
|
|
|
|
|
содержатся в пространстве имен safe. Команда
|
|
|
|
|
<strong>::safe::interpCreate</strong> создает безопасный интерпретатор.
|
|
|
|
|
Возможные опции команды описаны ниже, см. <a
|
|
|
|
|
href=#ОПЦИИ>"Опции"</a>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Команда возвращает имя созданного интерпретатора. Команда
|
|
|
|
|
<strong>::safe::interpInit</strong> аналогична, но ее первым аргументом
|
|
|
|
|
должно быть имя интерпретатора, созданного с помощью команды
|
|
|
|
|
<strong><a href=interp.html>interp</a></strong>.</p>
|
|
|
|
|
|
|
|
|
|
<p>Команда <strong>::safe::interpDelete</strong> удаляет интерпретатор, имя
|
|
|
|
|
которого использовано в качестве аргумента. Команда
|
|
|
|
|
<strong>::safe::interpConfigure</strong> позволяет задать опции для
|
|
|
|
|
безопасного интерпретатора или получить информацию об заданных
|
|
|
|
|
ранее опциях. Подробно опции описаны ниже (см. <a
|
|
|
|
|
href=#ОПЦИИ>Опции</a>).</p>
|
|
|
|
|
|
|
|
|
|
<p>Для каждого безопасного интерпретатора, созданного с помощью
|
|
|
|
|
команды <strong>::safe::interpCreate</strong> или инициированного с
|
|
|
|
|
помощью команды <strong>::safe::interpInit</strong> в родительском
|
|
|
|
|
интерпретаторе создается список доступных каталогов -
|
|
|
|
|
виртуальный путь. Каждый каталог в пути связывается с реальным
|
|
|
|
|
каталогом локальной файловой системы и с меткой, доступной в
|
|
|
|
|
безопасном интерпретаторе. В результате надежный интерпретатор
|
|
|
|
|
обходится без сведений о реальной файловой системе на машине, на
|
|
|
|
|
которой исполняется интерпретатор. Когда в надежном
|
|
|
|
|
интерпретаторе используется метка для доступа к конкретному
|
|
|
|
|
файлу (например, для выполнения команды <a
|
|
|
|
|
href=source.html><strong>source</strong></a> или <a
|
|
|
|
|
href=load.html><strong>load</strong></a>), метка заменяется в родительском
|
|
|
|
|
интерпретаторе на настоящее имя каталога и необходимый файл
|
|
|
|
|
ищется в файловой системе. Надежный интерпретатор не получает
|
|
|
|
|
сведений о реальном имени файла в файловой системе. Для работы с
|
|
|
|
|
виртуальными именами файлов предусмотрены специальные
|
|
|
|
|
команды. Команда <strong>::safe::interpConfigure</strong> позволяет
|
|
|
|
|
задавать новый виртуальный путь для интерпретатора. Команда
|
|
|
|
|
<strong>::safe::interpAddToAccessPath</strong> позволяет добавлять
|
|
|
|
|
каталоги к виртуальному пути указанного безопасного
|
|
|
|
|
интерпретатора. Команда <strong>::safe::interpFindInAccessPath</strong>
|
|
|
|
|
позволяет найти каталог в виртуальном пути для безопасного
|
|
|
|
|
интерпретатора и получить его метку. Если каталог не найден,
|
|
|
|
|
выдается сообщение об ошибке.</p>
|
|
|
|
|
|
|
|
|
|
<p>Команда <strong>::safe::setLogCommand</strong> позволяет задать скрипт,
|
|
|
|
|
который выполняется при каждом событии в безопасном
|
|
|
|
|
интерпретаторе. Этот скрипт вызывается с одним аргументом -
|
|
|
|
|
строкой, содержащей описание события.</p>
|
2015-10-19 13:27:31 +03:00
|
|
|
|
</body>
|
|
|
|
|
</html>
|
2018-02-05 17:22:04 +03:00
|
|
|
|
|