safe(3tcl) | Tcl Built-In Commands | safe(3tcl) |
Safe - 用来建立和操纵安全解释器的机制。
::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...?
?-accessPath pathList? ?-statics boolean? ?-noStatics? ?-nested boolean? ?-nestedLoadOk? ?-deleteHook script?
Safe Tcl 是一种机制,用于安全的执行不可信任的 Tcl 脚本,并为有潜在危险功能的脚本提供访问中介。
Safe Base 确保不可信任的 Tcl 脚本不能损坏宿主应用。Safe Base 防止完整性和隐私攻击。防止不可信任的 Tcl 脚本败坏宿主应用或计算机的状况。防止不可信任的脚本把存储在宿主主机或宿主应用中的信息泄露给任何人群。
Safe Base 允许一个主解释器建立安全、受限制的解释器,它包括为 source, load, file, encoding, 和 exit 命令预定义的一系列别名,并可以使用自动装载和包机制。
不向安全解释器透露文件系统的任何东西,它只能访问包含记号(token)的虚拟的路径。当安全解释器请求 source(载入)一个文件的时候,它使用在虚拟路径中的记号作为要 source 的文件名的一部分;主解释器透明的把这个记号转换成一个实际的路径名并执行所要求的操作 (详情参见下面的 SECURITY 安全 章节). 可以使用下面描述的命令标志来选择不同的安全级别。
Safe Base 在主解释器中提供的所有命令驻留在 safe 名字空间中:
在主解释器中提供了下列命令:
::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
下列选项通用于 ::safe::interpCreate、::safe::interpInit、和 ::safe::interpConfigure。任何选项都可缩写为它的最小的无歧义的名字。选项的名字是大小写不敏感的。
在安全解释器中提供了下列别名:
Safe Base 不尝试完全的防止烦恼(annoyance)和拒绝服务攻击。这些形式的攻击妨碍应用或用户临时的使用计算机来完成有用的工作,例如消耗所有可利用的 CPU 时间或所有可利用的屏幕 real estate。这些攻击尽管很恶劣,但一般不如 Safe Base 主要防护的完整性和隐私攻击那么重要。
除了在 interp 手册页中定义的安全命令集之外,在安全解释器中可获得的命令还包括给 source、load、exit 的作为中介的(mediate)别名以及 file 和 encoding 命令的安全子集。安全解释器还可以自动装载代码并可以请求装载包。
因为这些命令中的一些命令访问本地文件系统,存在着对它的目录结构的潜在的信息泄露。为了防止这个问题,接受文件名作为参数的命令在安全解释器中使用记号来替代真实的目录名。在主解释器中介一个要求例如 source 一个文件的时候,把这些记号转换成实际路径名。在主解释器中维护这个虚拟路径系统,针对每个用 ::safe::interpCreate 建立的或用 ::safe::interpInit 初始化的安全解释器,这个路径把在安全解释器中可访问的记号映射成在本地文件系统上的真实路径名,这样就防止了安全解释器去获取关于这个解释器在其上执行的主机的文件系统结构的知识。可以提供给从解释器中的 source 和 load 别名的有效的文件名参数只能是下面这种形式的路径: [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 与新的记号列表同步。
interp(n), library(n), load(n), package(n), source(n), unknown(n)
alias, auto-loading, auto_mkindex, load, master interpreter, safe interpreter, slave interpreter, source
寒蝉退士
2001/11/07
http://cmpp.linuxforum.net
本页面中文版由中文
man 手册页计划提供。
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
8.0 | Tcl |