2012-08-28 66 views
31

我讀到有關在docs Ruby的字符串方法來到翻過方法什麼是Ruby的對象#污點和對象#信任方法?

  • taint
  • trust
  • untaint
  • untrust

我不知道他們做了什麼,我們使用它們的情況是什麼?有沒有人使用過其中的任何一個例子會很好。

+1

他們是Ruby的安全模型的一部分。 – Linuxios

+0

好的,我們有沒有在某些情況下使用它,你有沒有機會混淆它。詞安全本身使它更有趣:) – PriteshJ

+0

我沒有與他們合作,但我可能會很快給出答案。這是我在哪裏的夜晚,所以也許在早上。 – Linuxios

回答

48

tainttrust是Ruby安全模型的一部分。在Ruby中,每個對象都帶有幾個標誌,它們中有兩個是Trusted標誌和Tainted標誌。這些標誌如何起作用取決於所謂的安全級別。安全級別存儲在$SAFE中。

程序中的每個線程和光纖都可以擁有自己的安全級別。安全級別範圍從0到4,0強制執行沒有安全性,4強制執行非常多,只能在您使用eval代碼時使用。你不能分配一個較低的值到$SAFE比它已經有。此外,在其中一個Ruby腳本運行作爲setuid UNIX系統中,紅寶石會自動將安全級別設置爲1

污點

當一個對象有它的污點標誌設置,這意味着,粗略,該對象是從哪裏來的一個不可靠的來源,因此不能用於敏感操作。當安全級別爲0時,污染標誌被忽略(但仍然設置,如果你願意,可以注意它)。有幾種方法與污點有關:

  • taint - 使對象變髒。除了安全級別4,您可以在所有級別上污染對象。
  • tainted? - 檢查對象是否受污染。
  • untaint - 從對象中移除污點。這可以只有用於安全級別0,1和2。

下面是來自pragprog鎬(source)的示例,說明污點:

# internal data 
# ============= 
x1 = "a string" 
x1.tainted?  → false 
x2 = x1[2, 4] 
x2.tainted?  → false 
x1 =~ /([a-z])/ → 0 
$1.tainted?  → false 
# external data 
# ============= 
y1 = ENV["HOME"] 
y1.tainted?  → true 
y2 = y1[2, 4] 
y2.tainted?  → true 
y1 =~ /([a-z])/ → 1 
$1.tainted?  → true 

總之,你不能被污染的數據使用危險的方法。所以,如果你這樣做在安全級別3時,你會得到一個錯誤:

eval(gets) 

信託

信任是簡單了很多。信任與對象是來自受信任的或不可信任的來源有關 - 基本上來說,它來自任何低於安全級別4或安全級別4的級別。我不確定Ruby的信任究竟會產生什麼影響,但需要看這裏: http://www.ruby-forum.com/topic/1887006


這裏有一些更多的資源: http://phrogz.net/ProgrammingRuby/taint.html - 對安全水平的一些偉大的東西,但我認爲這1.8的 - 有一個更新版本1.9,單單隻出現在書的印刷版本。

http://www.ruby-forum.com/topic/79295 - 在安全是否足夠安全。

+1

你保持你的話,給我帶來了一些很棒的東西的榮譽,它是一個很好的答案我正在尋找,謝謝 – PriteshJ

+0

@PriteshJ:當然。很高興我能幫上忙。 – Linuxios

+0

我找到了一個很好的鏈接並將其添加爲回答檢查出可能是你能幫助更多的人喜歡我與:) – PriteshJ

4

tainttrust每個都設置了一個標誌,表示對象隨處攜帶它。我可以告訴的唯一區別是(從ruby-doc.org),當給定受污染的對象時,某些方法調用的行爲會有所不同,而信任似乎完全取決於程序員解釋。

污點的主要目的是將用戶輸入標記爲潛在危險,例如一個動態加載的腳本或CGI表單數據。然後實施清理方法,確保對象在代碼中的其他地方使用之前是安全的並將它們解除。另請參閱「What's the purpose of tainting Ruby objects?」。

0

我發現這個鏈接給我信息有關紅寶石tainted數據。

http://ruby.about.com/od/advancedruby/a/tainted.htm

"Tainted" objects are those that have come from some type of user input. Either from a file, the keyboard or the network, unless the object is a literal in the program or created by the program directly, it will be tainted. The tainted flag is always there on your objects, all you have to do is check it before you do anything unsafe. If you've confirmed that the data is indeed safe, you can then untaint the object.

+0

鏈接重定向到https://www.thoughtco.com/what-is-programming-958331 – infomaniac

+0

可悲的是肯定的@infomaniac。它一開始工作 – PriteshJ

相關問題