下面的 Object#methods 有何不同?
- 污点和信任
- 不污染和不信任
注意:正如@themarketka 所指出的,从 Ruby 2.2.2 开始,信任已被弃用,并且等同于污染。
差异相当奇怪,并且没有特别好的记录。
注意:在 $SAFE 级别 0 上,这些标记都没有任何作用。
污染的概念是一个对象是否来自可信来源。从标准输入输入的字符串被污染,但刚刚分配的字符串没有。在更高的安全级别上,禁止对受污染数据进行各种潜在危险操作(抛出SecurityException
)。eval
,等操作system
。此外,污染可以从所谓的“子”对象继承:
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}")
( DO NOT EXECUTE"rm -rf #{...}"
) 的操作,Ruby 会抱怨我的未污染字符串 ( ) 和受污染的字符串 ( gets.chomp
) 的组合创建了一个受污染的字符串。
与污染不同,信任适用于代码和对象。所有正在运行的代码要么受信任,要么不受信任,所有对象要么受信任,要么不受信任。不受信任的代码只能修改不受信任的对象。不受信任的代码只能创建不受信任的对象。在安全级别 0-2 创建的代码和对象是受信任的,但在 $SAFE 级别 3 或 4 运行或创建的任何内容都是不受信任的,并且只能修改不受信任的对象。
污染和信任之间的区别是微妙的。污染是关于您可以对数据执行哪些操作,但信任是关于您可以访问哪些数据。它们保护系统的不同部分。此外,虽然污染总是存在,并且被污染的对象可以存在于任何安全级别,但信任仅在所谓的“沙盒”$SAFE 级别 3 和 4 中发挥作用,这些级别几乎专门用于沙盒外部代码。