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

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

安全模型

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

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

對象的污染

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

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

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

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

Object#taint

污染對象

Object#tainted?

若對象受到了污染就返回真

Object#untaint

消除對象受到的污染

安全級(jí)別

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

[ruby-list:37415]

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

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

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

0級(jí)

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

被污染對象

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

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

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

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

禁止的操作

  • 沒有

1級(jí)

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

被污染對象

  • 與0級(jí)相同

禁止的操作

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

2級(jí)

被污染對象

  • 與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í)

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

被污染對象

  • 所有生成的對象

禁止的操作

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

  • Object#untaint

4級(jí)

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

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

被污染對象

  • 與3級(jí)相同。

禁止的操作

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

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

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

  • 當(dāng)$SAFE = 0時(shí)才執(zhí)行require
  • 若超過Level1的話,啟動(dòng)時(shí)會(huì)有下列不同
    • 不把環(huán)境變量RUBYLIB添加到$:之中
    • 不把當(dāng)前目錄添加到$:之中
    • 不處理環(huán)境變量RUBYOPT
    • 不能使用下列開關(guān) -s -S -e -r -i -I -x (就算腳本被setgid, setuid也是如此)
    • 不會(huì)從標(biāo)準(zhǔn)輸入讀入程序 (就算腳本被setgid, setuid也一樣)
  • 被setuid, setgid的腳本將在超過$SAFE = 1的狀態(tài)下運(yùn)行。
  • 在3級(jí)以上的環(huán)境中生成的Proc將會(huì)記下該時(shí)刻的安全級(jí)別。若受污染的Proc對象被call的話,它將以記憶的安全級(jí)別來運(yùn)行。
  • 若受污染的Method對象被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。
  • 超過4級(jí)的話,即使out of memory也不會(huì)fatal。
  • 根據(jù)您安裝情況的不同,F(xiàn)ixnum Symbol true false nil可能不會(huì)被污染。但請注意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ò)展庫中的應(yīng)對

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

[ruby-list:37407]


Vorheriger Artikel: N?chster Artikel: