我在docs年前读过关于Ruby字符串方法的书,后来偶然发现了这些方法
taint
trust
untaint
untrust
我不知道他们做什么,我们在哪种情况下使用他们?有人用过吗?举个例子就好了.
我在docs年前读过关于Ruby字符串方法的书,后来偶然发现了这些方法
taint
trust
untaint
untrust
我不知道他们做什么,我们在哪种情况下使用他们?有人用过吗?举个例子就好了.
taint
和trust
是Ruby安全模型的一部分.在Ruby中,每个对象都带有几个标志,其中两个是受信任标志和受污染标志.这些标志的作用取决于所谓的安全级别.安全级别存储在$SAFE
中.
程序中的每个线程和光纤都有自己的安全级别.安全级别从0到4不等,0不强制执行安全性,4强制执行太多安全性,只有当你输入代码时才应该使用.您可以为$SAFE
指定一个比其现有值更低的值.此外,在Ruby脚本以setuid形式运行的UNIX系统上,Ruby会自动将安全级别设置为1.
当一个对象设置了它的污染标志时,这大致意味着该对象来自不可靠的来源,因此不能用于敏感操作.当安全级别为0时,污染标志将被忽略(但仍然设置,如果需要,您可以关注它).有几种与污染有关的方法:
taint
--使一个物体受到污染.除了安全级别4,你可以在所有级别上污染一个物体.tainted?
--判断物体是否受到污染.untaint
--go 除物体上的污染.这可用于安全级别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/79295--关于安全是否足够安全.