2013-03-09 23 views

回答

1

注:作为@themarketka指出,像Ruby 2.2.2的,信任已被弃用,并取得相当的污点。


这个差别很奇怪,没有特别好记录。

注意:在$ SAFE级别0,这些标记都没有做任何事情。

Tainting

污染的概念是对象是否来自可信来源。从标准输入输入的字符串被污染,但刚分配的字符串不是。在更高的安全级别上,禁止对受到污染的数据进行各种潜在的危险操作(抛出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)的组合会创建一个受污染的字符串。

信任

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

差异

污点和信任之间的差别是很微妙的。 Tainting全是关于什么操作您可以对数据进行操作,但信任关于您可以访问哪些数据访问。他们保护系统的不同部分。此外,虽然污点总是存在,并且污染对象可以在任何安全级别存在,但只有在所谓的“沙箱”$ SAFE级别3和4中才会发挥作用,这些级别几乎专用于沙盒外部代码。

+0

两年后,[2.2.2的Ruby文档](http://ruby-doc.org/core-2.2.2/Object.html#method-i-untrusted-3F)声明'trust '方法被_deprecated_和等同于他们的'异味'对应物。 – themarketka 2015-08-09 09:56:34

相关问题