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 |