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