无法理解Ruby中的Object#taint和Object#trust之间的区别

时间:2013-03-09 14:23:51

标签: ruby ruby-1.9.3

以下Object#方法如何相互不同?

  • 污点和信任
  • unaint and untrust

1 个答案:

答案 0 :(得分:1)

注意:正如@themarketka指出的那样,从Ruby 2.2.2开始,信任已经被弃用并且等同于污染。


差异很奇怪,并没有特别好记录。

注意:在$ SAFE 0级时,这些标记都不会做任何事情。

污点

污点的概念是对象是否来自可靠来源。从标准输入输入的字符串被污染,但刚刚分配的字符串不是。在更高的安全级别,禁止对受污染数据进行各种潜在危险操作(抛出SecurityException)。像evalsystem等操作。此外,污染可以从所谓的“子”对象继承:

2.0.0p0 :001 > s = "Hi!"
 => "Hi!"
2.0.0p0 :002 > s.taint
 => "Hi!"
2.0.0p0 :003 > (s + "World").tainted?
 => true

所以,如果我在更高的安全级别执行类似system("rm -rf #{gets.chomp}")不执行)的操作,Ruby会抱怨我的无字符串("rm -rf #{...}")的组合并且受污染的字符串(gets.chomp)会创建一个受污染的字符串。

信任

与污染不同,信任适用于代码和对象。所有正在运行的代码都是受信任的或不受信任的,并且所有对象都是受信任的或不受信任的。不受信任的代码只能修改不受信任的对象。不受信任的代码只能创建不受信任的对象。在安全级别0-2创建的代码和对象是受信任的,但在$ SAFE级别3或4上运行或创建的任何内容都是不可信的,并且只能修改不受信任的对象。

差异

污点和信任之间的区别是微妙的。污染是关于您可以对数据进行的操作的全部内容,但信任是指您可以访问的数据。它们保护系统的不同部分。此外,虽然污染始终存在,并且受污染的对象可以存在于任何安全级别,但信任仅在所谓的“沙盒”$ SAFE级别3和4中发挥作用,这些级别几乎专门用于沙箱外部代码。