亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

directory search
Ruby用戶指南 3、開(kāi)始 4、簡(jiǎn)單的例子 5、字符串 6、正則表達(dá)式 7、數(shù)組 8、回到那些簡(jiǎn)單的例子 9、流程控制 10、迭代器 11、面向?qū)ο笏季S 12、方法 13、類(lèi) 14、繼承 15、重載方法 16、訪問(wèn)控制 17、單態(tài)方法 18、模塊 19、過(guò)程對(duì)象 20、變量 21、全局變量 22、實(shí)變量 23、局部變量 24、類(lèi)常量 25、異常處理:rescue 26、異常處理:ensure 27、存取器 28、對(duì)象的初始化 29、雜項(xiàng) RGSS入門(mén)教程 1、什么是RGSS 2、開(kāi)始:最簡(jiǎn)單的腳本 3、數(shù)據(jù)類(lèi)型:數(shù)字 4、數(shù)據(jù)類(lèi)型:常量與變量 5、數(shù)據(jù)類(lèi)型:字符串 6、控制語(yǔ)句:條件分歧語(yǔ)句 7、控制語(yǔ)句:循環(huán) 8、函數(shù) 9、對(duì)象與類(lèi) 10、顯示圖片 11、數(shù)組 12、哈希表(關(guān)聯(lián)數(shù)組) 13、類(lèi) 14、數(shù)據(jù)庫(kù) 15、游戲?qū)ο?/a> 16、精靈的管理 17、窗口的管理 18、活動(dòng)指令 19、場(chǎng)景類(lèi) Programming Ruby的翻譯 Programming Ruby: The Pragmatic Programmer's Guide 前言 Roadmap Ruby.new 類(lèi),對(duì)象和變量 容器Containers,塊Blocks和迭代Iterators 標(biāo)準(zhǔn)類(lèi)型 深入方法 表達(dá)式Expressions 異常,捕捉和拋出(已經(jīng)開(kāi)始,by jellen) 模塊 基本輸入輸出 線程和進(jìn)程 當(dāng)遭遇挫折 Ruby和它的世界 Ruby和Web開(kāi)發(fā) Ruby Tk Ruby 和微軟的 Windows 擴(kuò)展Ruby Ruby語(yǔ)言 (by jellen) 類(lèi)和對(duì)象 (by jellen) Ruby安全 反射Reflection 內(nèi)建類(lèi)和方法 標(biāo)準(zhǔn)庫(kù) OO設(shè)計(jì) 網(wǎng)絡(luò)和Web庫(kù) Windows支持 內(nèi)嵌文檔 交互式Ruby Shell 支持 Ruby參考手冊(cè) Ruby首頁(yè) 卷首語(yǔ) Ruby的啟動(dòng) 環(huán)境變量 對(duì)象 類(lèi) 執(zhí)行 結(jié)束時(shí)的相關(guān)處理 線程 安全模型 正則表達(dá)式 字句構(gòu)造 程序 變量和常數(shù) 字面值 操作符表達(dá)式 控制結(jié)構(gòu) 方法調(diào)用 類(lèi)/方法的定義 內(nèi)部函數(shù) 內(nèi)部變量 內(nèi)部常數(shù) 內(nèi)部類(lèi)/模塊/異常類(lèi) 附加庫(kù) Ruby變更記錄 ruby 1.6 特性 ruby 1.7 特性 Ruby術(shù)語(yǔ)集 Ruby的運(yùn)行平臺(tái) pack模板字符串 sprintf格式 Marshal格式 Ruby FAQ Ruby的陷阱
characters

安全模型

為了安全地運(yùn)行CGI等程序,Ruby設(shè)置了安全結(jié)構(gòu)。

Ruby的安全模型由“對(duì)象的污染”和“安全級(jí)別”構(gòu)成。

對(duì)象的污染

Ruby有時(shí)會(huì)認(rèn)為對(duì)象“遭到了污染”,這主要有兩種用途。

第一,以不安全的輸入為基礎(chǔ)制成的對(duì)象就是“受污染”的對(duì)象,不能用作“危險(xiǎn)操作”的參數(shù)。這主要是為了防止惡意數(shù)據(jù)導(dǎo)致程序作出一些意外的危險(xiǎn)動(dòng)作。

第二,可以使安全對(duì)象(未遭污染的對(duì)象)得到保護(hù),免遭不安全對(duì)象的威脅。若安全級(jí)別為4,則對(duì)未受污染的對(duì)象進(jìn)行操作時(shí)就會(huì)受到很多限制,這正體現(xiàn)了對(duì)于安全方面的考慮。

與對(duì)象的污染有關(guān)的方法

Object#taint

污染對(duì)象

Object#tainted?

若對(duì)象受到了污染就返回真

Object#untaint

消除對(duì)象受到的污染

安全級(jí)別

每個(gè)線程都有特有的“安全級(jí)別”。安全級(jí)別越高,操作受到的限制也就越多。線程局部變量$SAFE標(biāo)明了安全級(jí)別。

[ruby-list:37415]

$SAFE的相關(guān)規(guī)則

  • 程序開(kāi)始時(shí)$SAFE的值為0
  • 各線程在生成時(shí)繼承父線程的$SAFE
  • 不能降低現(xiàn)有的$SAFE

從原則上講,低安全等級(jí)時(shí)的限制也適用于高安全等級(jí)。例如,若某操作在1級(jí)就被禁止的話,在2級(jí)就更不可能通過(guò)了。

0級(jí)

默認(rèn)的安全級(jí)別。

被污染對(duì)象

  • 可從IO、環(huán)境變量或命令行參數(shù)(ARGV)中獲得的字符串

    (只有環(huán)境變量PATH例外)

環(huán)境變量PATH比較特殊,只有當(dāng)其值中含有危險(xiǎn)路徑時(shí)才會(huì)受到污染。

這時(shí)所說(shuō)的危險(xiǎn)路徑是指,誰(shuí)都可以變更或?qū)懭氲穆窂?。從根目錄起層層檢查,若包含誰(shuí)都可以更改的地方的話,該路徑就是危險(xiǎn)的。

禁止的操作

  • 沒(méi)有

1級(jí)

特指以安全程序處理不安全數(shù)據(jù)的情況。適合于用CGI等處理用戶的輸入。

被污染對(duì)象

  • 與0級(jí)相同

禁止的操作

  • 下列以受污染字符串為參數(shù)的操作
    • Dir, IO, File、FileTest的類(lèi)方法、方法
    • 使用FileTest操作符、比較文件的更新時(shí)間
    • 執(zhí)行外部命令(system, exec, ``)
    • eval (參考4級(jí)的說(shuō)明)
    • 加載頂層(若使用第二參數(shù)進(jìn)行wrap則可以執(zhí)行)
    • require
    • trap
  • 執(zhí)行外部命令(只有當(dāng)環(huán)境變量PATH中包含危險(xiǎn)路徑時(shí))

2級(jí)

被污染對(duì)象

  • 與1級(jí)相同

禁止的操作

在1級(jí)限制的基礎(chǔ)上,以下操作也被禁止。

  • Dir.chdir Dir.chroot Dir.mkdir Dir.rmdir
  • File.chown File.chmod File.umask File.truncate File#lstat File#chmod File#chown File#delete File#unlink File#truncate File#flock 以及FileTest模塊的方法
  • IO#ioctl, IO#fcntl
  • Process.fork Process.setpgid Process.setsid Process.setpriority Process.egid= Process.kill
  • 使用危險(xiǎn)路徑load
  • 以被污染字符串為參數(shù)的load(即使被wrap也不行)
  • syscall
  • exit!
  • trap

3級(jí)

所有生成的對(duì)象都被污染。適于為在4級(jí)狀態(tài)下運(yùn)行程序提供環(huán)境。

被污染對(duì)象

  • 所有生成的對(duì)象

禁止的操作

在2級(jí)限制的基礎(chǔ)上,以下操作也被禁止。

  • Object#untaint

4級(jí)

執(zhí)行不安全程序時(shí)等級(jí)。

此時(shí),3級(jí)時(shí)禁止的“受污染字符串的eval”卻被解禁。(這是因?yàn)橛胑val時(shí),所有的危險(xiǎn)操作都已經(jīng)被禁止了。)

被污染對(duì)象

  • 與3級(jí)相同。

禁止的操作

在3級(jí)限制(如上所述,不包括eval)的基礎(chǔ)上,以下操作也被禁止。

  • Object#taint
  • 改變頂層的定義(autoload, load, include)
  • 對(duì)既存方法的再定義
  • 改變Object類(lèi)的定義
  • 改變未被污染的類(lèi)和模塊的定義或改變類(lèi)變量
  • 改變未被污染的對(duì)象的狀態(tài)
  • 改變未被污染的全局變量
  • 使用未被污染的IO及File的處理
  • 輸出到IO
  • 程序的終結(jié)(exit, abort)(且out of memory也不fatal)
  • 對(duì)其他線程造成影響的Thread類(lèi)的操作以及其他線程的Thread#[]
  • ObjectSpace._id2ref
  • ObjectSpace.each_object ruby 1.7 feature
  • 改變環(huán)境變量
  • srand

其他的安全級(jí)別相關(guān)信息

  • 當(dāng)$SAFE = 0時(shí)才執(zhí)行require
  • 若超過(guò)Level1的話,啟動(dòng)時(shí)會(huì)有下列不同
    • 不把環(huán)境變量RUBYLIB添加到$:之中
    • 不把當(dāng)前目錄添加到$:之中
    • 不處理環(huán)境變量RUBYOPT
    • 不能使用下列開(kāi)關(guān) -s -S -e -r -i -I -x (就算腳本被setgid, setuid也是如此)
    • 不會(huì)從標(biāo)準(zhǔn)輸入讀入程序 (就算腳本被setgid, setuid也一樣)
  • 被setuid, setgid的腳本將在超過(guò)$SAFE = 1的狀態(tài)下運(yùn)行。
  • 在3級(jí)以上的環(huán)境中生成的Proc將會(huì)記下該時(shí)刻的安全級(jí)別。若受污染的Proc對(duì)象被call的話,它將以記憶的安全級(jí)別來(lái)運(yùn)行。
  • 若受污染的Method對(duì)象被call的話,將以4級(jí)狀態(tài)運(yùn)行。
  • 若將受污染的字符串指定為trap/trace_var的第二參數(shù)時(shí),將以4級(jí)狀態(tài)運(yùn)行ruby 1.7 feature:在 version 1.7中,若將受污染的字符串指定為第二參數(shù)而運(yùn)行trap/trace_var的話,馬上就會(huì)引發(fā)異常SecurityError。
  • 超過(guò)4級(jí)的話,即使out of memory也不會(huì)fatal。
  • 根據(jù)您安裝情況的不同,F(xiàn)ixnum Symbol true false nil可能不會(huì)被污染。但請(qǐng)注意Bignum Float可能會(huì)受到污染。

實(shí)例

$SAFE級(jí)別一旦升高就不能調(diào)低了。如下所示,可以使用線程將程序的一部分置入高安全級(jí)別狀態(tài)下運(yùn)行。

例:

def safe(level)
  result = nil
  Thread.start {
    $SAFE = level
    result = yield
  }.join
  result
end

safe(4) { puts "hello" }    # 因?yàn)槭?SAFE所以例外
puts "world"                # 外部不受影響

擴(kuò)展庫(kù)中的應(yīng)對(duì)

  • 在擴(kuò)展庫(kù)中,有必要對(duì)對(duì)象的污染狀態(tài)進(jìn)行適當(dāng)?shù)膫鞑ァ?
  • 改變?nèi)譅顟B(tài)或與外部聯(lián)系之前,有必要檢查安全級(jí)別。

[ruby-list:37407]


Previous article: Next article: