Manpages

NAME

Safe - 用 来 建 立 和 操 纵 安 全 解 释 器 的 机 制 。

总 览 SYNOPSIS

::safe::interpCreate ?slave? ?options...? ::safe::interpInit slave ?options...? ::safe::interpConfigure slave ?options...? ::safe::interpDelete slave ::safe::interpAddToAccessPath slave directory ::safe::interpFindInAccessPath slave directory ::safe::setLogCmd ?cmd arg...?

OPTIONS

?-accessPath pathList? ?-statics boolean? ?-noStatics? ?-nested boolean? ?-nestedLoadOk? ?-deleteHook script?

描 述 DESCRIPTION

Safe Tcl 是 一 种 机 制 , 用 于 安 全 的 执 行 不 可 信 任 的 Tcl 脚 本 , 并 为 有 潜 在 危 险 功 能 的 脚 本 提 供 访 问 中 介 。

Safe Base 确 保 不 可 信 任 的 Tcl 脚 本 不 能 损 坏 宿 主 应 用 。 Safe Base 防 止 完 整 性 和 隐 私 攻 击 。 防 止 不 可 信 任 的 Tcl 脚 本 败 坏 宿 主 应 用 或 计 算 机 的 状 况 。 防 止 不 可 信 任 的 脚 本 把 存 储 在 宿 主 主 机 或 宿 主 应 用 中 的 信 息 泄 露 给 任 何 人 群 。

Safe Base 允 许 一 个 主 解 释 器 建 立 安 全 、 受 限 制 的 解 释 器 , 它 包 括 为 source, load, file, encoding, 和 exit 命 令 预 定 义 的 一 系 列 别 名 , 并 可 以 使 用 自 动 装 载 和 包 机 制 。 不 向 安 全 解 释 器 透 露 文 件 系 统 的 任 何 东 西 , 它 只 能 访 问 包 含 记 号 (token)的 虚 拟 的 路 径 。 当 安 全 解 释 器 请 求 source(载 入 )一 个 文 件 的 时 候 , 它 使 用 在 虚 拟 路 径 中 的 记 号 作 为 要 source 的 文 件 名 的 一 部 分 ; 主 解 释 器 透 明 的 把 这 个 记 号 转 换 成 一 个 实 际 的 路 径 名 并 执 行 所 要 求 的 操 作 (详 情 参 见 下 面 的 SECURITY 安 全 章 节 ). 可 以 使 用 下 面 描 述 的 命 令 标 志 来 选 择 不 同 的 安 全 级 别 。

Safe Base 在 主 解 释 器 中 提 供 的 所 有 命 令 驻 留 在 safe 名 字 空 间 中 :

命 令 COMMANDS

在 主 解 释 器 中 提 供 了 下 列 命 令 : ::

safe::interpCreate ?slave? ?options...? 建 立 一 个 安 全 解 释 器 , 安 装 在 ALIASES 别 名 章 节 中 描 述 的 别 名 并 初 始 化 在 OPTIONS 选 项 中 提 供 的 自 动 装 载 和 包 机 制 。 对 可 选 择 的 参 数 的 描 述 请 参 见 下 面 OPTIONS 选 项 章 节 。 如 果 省 略 了 slave 参 数 , 则 生 成 一 个 名 字 。 ::safe::interpCreate 总 是 返 回 解 释 器 的 名 字 。 ::
safe::interpInit
slave ?options...? 除 了 不 建 立 安 全 解 释 器 之 外 , 这 个 命 令 类 似 于 interpCreate 命 令 。 必 须 已 经 通 过 其 他 方 式 如 interp create -safe建 立 了 这 个 slave。 如 果 未 给 出
options
, 则 把 给 指 名 的 这 个 解 释 器 所 有 选 项 的 设 置 返 回 为 给 这 个
slave
的 选 项 和 它 们 当 前 的 值 的 一 个 列 表 。 如 果 提 供 了 一 个 单 一 的 补 充 参 数 , 它 将 返 回 有 两 个 元 素
name
value 的 一 个 列 表 , 这 里 的 name 是 选 项 的 全 名 而
value
是 给 slave 的 这 个 选 项 当 前 值 。 如 果 提 供 多 于 两 个 补 充 选 项 , 它 将 重 新 配 置 这 个 安 全 解 释 器 并 只 改 变 每 个 提 供 的 选 项 。 关 于 选 项 的 描 述 请 参 见 下 面 的
OPTIONS 章 节 。 使 用 的 例 子 :

# Create a new interp with the same configuration as "$i0" : set i1 [eval safe::interpCreate [safe::interpConfigure $i0]] # Get the current deleteHook set dh [safe::interpConfigure $i0 -del] # Change (only) the statics loading ok attribute of an interp # and its deleteHook (leaving the rest unchanged) : safe::interpConfigure $i0 -delete {foo bar} -statics 0 ; ::

safe::interpDelete slave 删 除 这 个 安 全 解 释 器 并 清 除 相 应 的 主 解 释 器 数 据 结 构 。 如 果 为 这 个 解 释 器 指 定 了 一 个 deleteHook 脚 本 , 则 在 删 除 这 个 解 释 器 之 前 执 行 这 个 脚 本 , 把 这 个 解 释 器 的 名 字 作 为 一 个 补 充 参 数 。 ::
safe::interpFindInAccessPath
slave directory 这 个 命 令 寻 找 并 返 回 在 安 全 解 释 器 的 当 前 虚 拟 访 问 路 径 中 给 实 际 路 径 directory 的 记 号 。 如 果 未 找 到 这 个 路 径 则 生 成 一 个 错 误 。 使 用 的 例 子 :

$slave eval [list set tk_library [::safe::interpFindInAccessPath $name $tk_library]] ::

safe::interpAddToAccessPath slave directory 这 个 命 令 把 directory 添 加 到 在 主 解 释 器 中 为 安 全 解 释 器 维 护 的 虚 拟 路 径 中 , 并 返 回 可 在 安 全 解 释 器 中 被 用 来 获 得 到 在 这 个 目 录 中 的 文 件 的 访 问 的 记 号 。 如 果 这 个 路 径 已 经 存 在 于 虚 拟 路 径 中 , 则 它 只 返 回 记 号 而 不 再 次 把 这 个 路 径 添 加 到 虚 拟 路 径 中 。 使 用 的 例 子 :

$slave eval [list set tk_library [::safe::interpAddToAccessPath $name $tk_library]] ::

safe::setLogCmd ?cmd arg...? 这 个 命 令 安 装 在 一 个 脚 本 , 在 这 个 安 全 解 释 器 的 特 定 的 生 命 周 期 事 件 发 生 的 时 候 将 被 调 用 。 在 调 用 这 个 命 令 而 不 加 参 数 时 , 它 返 回 当 前 安 装 的 脚 本 。 在 调 用 并 加 一 个 参 数 空 串 时 , 则 删 除 当 前 安 装 的 脚 本 并 关 闭 日 志 记 录 。 调 用 这 个 脚 本 时 将 加 上 一 个 补 充 参 数 , 它 描 述 所 感 兴 趣 的 事 件 。 主 要 的 目 的 是 帮 助 调 试 安 全 解 释 器 。 在 安 全 解 释 器 只 能 得 到 一 个 一 般 错 误 消 息 的 时 候 你 可 以 使 用 这 个 设 施 获 得 完 整 的 错 误 消 息 。 这 防 止 安 全 解 释 器 见 到 关 于 失 败 的 消 息 和 其 他 可 能 包 含 敏 感 信 息 如 真 实 路 径 名 的 其 他 事 件 的 消 息 。 使 用 的 例 子 : ::safe::setLogCmd puts stderr 下 面 是 一 个 样 本 对 话 的 输 出 , 这 里 一 个 安 全 解 释 器 尝 试 着 source 一 个 在 它 的 虚 拟 访 问 路 径 中 找 不 到 的 文 件 。 注 意 这 个 安 全 解 释 器 只 接 收 到 一 个 错 误 消 息 , 说 这 个 文 件 未 找 到 :

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 set to {$p(:0:)}
ERROR for slave interp10 : /foo/bar/init.tcl: no such file or directory

选 项 OPTIONS

下 列 选 项 通 用 于 ::safe::interpCreate::safe::interpInit、 和 ::safe::interpConfigure。 任 何 选 项 都 可 缩 写 为 它 的 最 小 的 无 歧 义 的 名 字 。 选 项 的 名 字 是 大 小 写 不 敏 感 的 。

-accessPath directoryList 这 个 选 项 设 置 目 录 的 列 表 , 安 全 解 释 器 可 以 从 中 sourceload 文 件 。 如 果 未 指 定 这 个 选 项 , 或 者 它 被 给 定 为 一 个 空 列 表 , 安 全 解 释 器 将 使 用 的 目 录 同 与 它 的 主 解 释 器 用 于 自 动 装 载 的 目 录 。 关 于 虚 拟 路 径 、 记 号 和 访 问 控 制 的 详 情 请 参 见 下 面 的 SECURITY 安 全 章 节 。
-statics
boolean 这 个 选 项 指 定 是 否 允 许 这 个 安 全 解 释 器 装 载 静 态 连 接 包 (如 load {} Tk)。 缺 省 值 是 true : 允 许 安 全 解 释 器 装 载 静 态 连 接 包 。
-noStatics
这 个 选 项 是 -statics false 的 一 个 方 便 的 简 写 , 它 指 定 不 允 许 这 个 安 全 解 释 器 装 载 静 态 连 接 包 。
-nested
boolean 这 个 选 项 指 定 是 否 允 许 这 个 安 全 解 释 器 把 包 装 载 到 它 自 己 的 子 解 释 器 中 。 缺 省 值 是 false : 不 允 许 安 全 解 释 器 把 包 装 载 到 它 自 己 的 子 解 释 器 中 。
-nestedLoadOk
这 个 选 项 是 -nested true 的 一 个 方 便 的 简 写 , 它 指 定 允 许 安 全 解 释 器 把 包 装 载 到 它 自 己 的 子 解 释 器 中 。
-deleteHook
script 当 给 这 个 选 项 以 一 个 非 空 的 script 的 时 候 , 它 将 在 实 际 删 除 这 个 从 解 释 器 之 前 在 主 解 释 器 中 被 求 值 , 并 加 上 这 个 安 全 解 释 器 的 名 字 作 为 一 个 补 充 的 参 数 。 给 予 一 个 空 值 则 去 除 任 何 当 前 为 这 个 安 全 解 释 器 安 装 的 删 除 回 调 (hook)脚 本 。 缺 省 值 ({})是 没 有 任 何 删 除 回 调 脚 本 。

别 名 ALIASES

在 安 全 解 释 器 中 提 供 了 下 列 别 名 :

source fileName 如 果 找 到 了 要 求 的 这 个 Tcl 源 文 件 , 则 把 它 source(装 载 )到 安 全 解 释 器 中 。 source 别 名 只 可 以 从 给 这 个 安 全 解 释 器 的 虚 拟 路 径 中 的 目 录 source 文 件 。 关 于 在 有 效 文 件 名 上 的 限 制 的 更 多 信 息 请 参 见 SECURITY 安 全 章 节 。
load
fileName 如 果 找 到 了 要 求 的 这 个 共 享 的 目 标 文 件 , 则 把 它 动 态 的 装 载 到 安 全 解 释 器 中 。 为 了 能 成 功 的 找 到 它 , 文 件 名 必 须 包 含 在 给 这 个 安 全 解 释 器 的 虚 拟 路 径 中 提 及 的 一 个 记 号 的 名 字 。 还 有 , 这 个 共 享 的 目 标 文 件 必 须 包 含 一 个 安 全 入 口 点 ; 详 情 请 参 见 load 命 令 的 手 册 条 目 。
file
?subCmd args...?

file 别 名 提 供 到 file命 令 的 子 命 令 的 一 个 安 全 子 集 的 访 问 ; 它 只 允 许 dirnamejoinextensionroottailpathnamesplit 子 命 令 。 关 于 这 些 子 命 令 的 详 情 请 参 见 file 命 令 的 手 册 条 目 。

encoding ?subCmd args...?

enconding 别 名 提 供 到 encoding 命 令 的 子 命 令 的 一 个 安 全 子 集 的 访 问 ; 它 不 允 许 设 置 系 统 编 码 , 不 允 许 其 他 子 命 令 包 括 system 检 查 当 前 编 码 。

exit 删 除 调 用 它 的 脚 本 并 停 止 它 的 计 算 , 但 这 个 解 释 器 存 在 于 其 中 的 那 个

Tcl

进 程 不 被 终 止 。

安 全 SECURITY

Safe Base 不 尝 试 完 全 的 防 止 烦 恼 (annoyance)和 拒 绝 服 务 攻 击 。 这 些 形 式 的 攻 击 妨 碍 应 用 或 用 户 临 时 的 使 用 计 算 机 来 完 成 有 用 的 工 作 , 例 如 消 耗 所 有 可 利 用 的 CPU 时 间 或 所 有 可 利 用 的 屏 幕 real estate。 这 些 攻 击 尽 管 很 恶 劣 , 但 一 般 不 如 Safe Base 主 要 防 护 的 完 整 性 和 隐 私 攻 击 那 么 重 要 。 除 了 在 interp 手 册 页 中 定 义 的 安 全 命 令 集 之 外 , 在 安 全 解 释 器 中 可 获 得 的 命 令 还 包 括 给 sourceloadexit 的 作 为 中 介 的 (mediate)别 名 以 及 fileencoding 命 令 的 安 全 子 集 。 安 全 解 释 器 还 可 以 自 动 装 载 代 码 并 可 以 请 求 装 载 包 。 因 为 这 些 命 令 中 的 一 些 命 令 访 问 本 地 文 件 系 统 , 存 在 着 对 它 的 目 录 结 构 的 潜 在 的 信 息 泄 露 。 为 了 防 止 这 个 问 题 , 接 受 文 件 名 作 为 参 数 的 命 令 在 安 全 解 释 器 中 使 用 记 号 来 替 代 真 实 的 目 录 名 。 在 主 解 释 器 中 介 一 个 要 求 例 如 source 一 个 文 件 的 时 候 , 把 这 些 记 号 转 换 成 实 际 路 径 名 。 在 主 解 释 器 中 维 护 这 个 虚 拟 路 径 系 统 , 针 对 每 个 用 ::safe::interpCreate 建 立 的 或 用 ::safe::interpInit 初 始 化 的 安 全 解 释 器 , 这 个 路 径 把 在 安 全 解 释 器 中 可 访 问 的 记 号 映 射 成 在 本 地 文 件 系 统 上 的 真 实 路 径 名 , 这 样 就 防 止 了 安 全 解 释 器 去 获 取 关 于 这 个 解 释 器 在 其 上 执 行 的 主 机 的 文 件 系 统 结 构 的 知 识 。 可 以 提 供 给 从 解 释 器 中 的 sourceload 别 名 的 有 效 的 文 件 名 参 数 只 能 是 下 面 这 种 形 式 的 路 径 : [file join token filename] (比 如 , 在 使 用 本 地 文 件 路 径 格 式 的 时 候 : 在 Unix 上 是 token/filename, 在 Windows 上 是 token\filename, 在 Mac 上 是 token:filename ), 这 里 的 token 表 示 accessPath 列 表 中 的 一 个 目 录 而 filename 是 在 这 个 目 录 中 一 个 文 件 (不 允 许 访 问 子 目 录 )。 在 一 个 安 全 解 释 器 中 , 当 在 要 source 或 装 载 一 个 文 件 的 一 个 请 求 中 使 用 一 个 记 号 的 时 候 , 检 查 这 个 记 号 并 把 它 转 换 成 真 实 路 径 名 , 并 在 文 件 系 统 上 定 位 要 被 source 或 装 载 的 文 件 。 安 全 解 释 器 不 能 获 取 关 于 文 件 系 统 上 在 其 下 存 储 这 个 文 件 的 实 际 路 径 名 的 知 识 。 为 了 进 一 步 防 止 潜 在 的 对 偶 然 的 包 括 在 可 以 被 安 全 解 释 器 source 的 文 件 集 中 的 敏 感 文 件 的 信 息 泄 露 , 限 制 source 别 名 为 访 问 满 足 下 列 约 束 的 文 件 : 文 件 名 必 须 是 十 四 个 字 符 或 更 短 , 必 须 不 包 含 多 于 一 个 的 点 (“.”), 不 许 终 止 于 扩 展 .tcl 或 是 被 调 用 的 tclIndex。 初 始 的 访 问 路 径 列 表 中 的 每 个 元 素 将 分 配 一 个 记 号 , 它 们 将 被 设 置 在 从 解 释 器 的 auto_path 中 并 且 这 个 列 表 的 第 一 个 元 素 将 被 设 置 为 这 个 从 解 释 器 的 tcl_library。 如 果 未 给 出 访 问 路 径 参 数 或 者 是 一 个 空 列 表 , 缺 省 的 行 为 是 让 从 解 释 器 访 问 的 包 与 主 解 释 器 已 经 访 问 了 的 包 相 同 (更 精 确 的 描 述 : 只 允 许 用 Tcl 写 成 的 包 (因 为 它 们 将 在 从 解 释 器 中 运 行 所 以 不 可 能 是 危 险 的 )和 提 供 Safe_Init 入 口 点 的 C 扩 展 )。 为 此 , 用 主 解 释 器 的 auto_path 来 构 造 从 解 释 器 的 访 问 路 径 。 为 了 从 解 释 器 能 成 功 的 装 载 Tcl 库 文 件 (它 自 身 包 括 自 动 装 载 机 制 ), 如 果 需 要 的 话 , 把 tcl_library 增 加 或 移 动 到 在 从 解 释 器 的 访 问 路 径 中 的 第 一 个 的 位 置 上 , 这 样 从 解 释 器 的 tcl_library 将 与 主 解 释 器 的 相 同 (它 的 真 实 路 径 对 从 解 释 器 仍 是 不 可 见 的 )。 为 了 使 自 动 装 载 对 于 从 解 释 器 和 主 解 释 器 在 缺 省 的 情 况 下 以 相 同 的 方 式 工 作 , 在 主 解 释 器 auto_path 中 的 每 个 目 录 的 第 一 层 子 目 录 将 被 添 加 (如 果 未 曾 包 含 的 话 )到 从 解 释 器 的 访 问 路 径 中 。 你 总 是 可 以 通 过 显 式 的 使 用 -accessPath 标 志 指 定 你 的 目 录 列 表 , 而 不 是 依 赖 于 这 个 缺 省 机 制 , 来 指 定 一 个 更 受 限 制 的 路 径 , 它 的 子 目 录 永 远 不 能 被 查 找 。 在 首 次 建 立 或 初 始 化 (例 如 通 过 interpConfigure -accessPath list)之 后 变 更 accessPath 的 时 候 , 将 在 安 全 解 释 器 中 自 动 的 求 值 auto_reset 来 使 它 的 auto_index 与 新 的 记 号 列 表 同 步 。

参 见 SEE ALSO

interp(n), library(n), load(n), package(n), source(n), unknown(n)

关 键 字 KEYWORDS

alias, auto-loading, auto_mkindex, load, master interpreter, safe interpreter, slave interpreter, source

[中 文 版 维 护 人 ]

寒 蝉 退 士

[中 文 版 最 新 更 新 ]

2001/11/07

《 中 国 Linux 论 坛 man 手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net

本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh