我正在阅读文档中关于Ruby字符串方法的内容,并且涉及到各种方法
taint
trust
untaint
untrust
我不知道他们做了什么,我们使用它们的情况如何?有人用过它们吗?例子很好.
Lin*_*ios 65
taint
并且trust
是Ruby安全模型的一部分.在Ruby中,每个对象都有一些随身携带的标志,其中两个是Trusted标志和Tainted标志.如何处理这些标志取决于所谓的安全级别.安全级别存储在$SAFE
.
程序中的每个线程和光纤都可以拥有自己的安全级别.安全级别范围从0到4,0强制执行无安全性和4强制执行,只应在您eval
编写代码时使用.您不能指定$SAFE
比现有值更低的值.此外,在Ruby脚本以setuid运行的UNIX系统上,Ruby会自动将安全级别设置为1.
当一个对象设置了污点时,粗略地表示该对象来自不可靠的源,因此不能用于敏感操作.当安全级别为0时,将忽略污染标记(但仍然设置,如果需要,可以注意它).有一些与污染有关的方法:
taint
- 使物体污染.您可以在所有级别上污染对象,但安全级别4除外.tainted?
- 检查物体是否受到污染.untaint
- 去除物体上的污点.这只能用于安全级别0,1和2.这是一个来自pragprog pickaxe(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
Run Code Online (Sandbox Code Playgroud)
总而言之,您不能对受污染的数据使用危险方法.因此,如果您在安全级别3中执行此操作,则会出现错误:
eval(gets)
Run Code Online (Sandbox Code Playgroud)
信任要简单得多.信任与对象是来自可靠还是不受信任的来源有关 - 基本上,它是来自低于安全级别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 - 关于安全是否足够安全.
taint
并且trust
每个都设置一个标志,该对象随身携带.我可以告诉的唯一区别(来自ruby-doc.org)是一些方法调用在给出受污染的对象时表现不同,而信任似乎完全由程序员来解释.
污点的主要目的是将用户输入标记为潜在危险,例如动态加载的脚本或CGI表单数据.然后,在代码中的其他位置使用它们之前,实现清理方法以确保对象是安全的并且将它们取消.
另请参阅" 污染Ruby对象的目的是什么? ".