Ruby的Object#taint和Object#trust方法是什么?

时间:2012-08-28 18:56:31

标签: ruby

我正在阅读docs中关于Ruby字符串方法的内容,并且涉及方法

  • taint
  • trust
  • untaint
  • untrust

我不知道他们做了什么,我们使用它们的情况如何?有人用过它们吗?例子很好。

3 个答案:

答案 0 :(得分:62)

tainttrust是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

总而言之,您不能对受污染的数据使用危险方法。因此,如果您在安全级别3执行此操作,则会出现错误:

eval(gets)

信任

信任要简单得多。信任与对象是来自可靠还是不受信任的来源有关 - 基本上,它是来自低于安全级别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 - 关于安全是否足够安全。

答案 1 :(得分:5)

tainttrust每个都设置了一个标志,该对象随身携带。我可以告诉的唯一区别(来自ruby-doc.org)是一些方法调用在给出受污染的对象时表现不同,而信任似乎完全取决于程序员解释。

污点的主要目的是将用户输入标记为潜在危险,例如:动态加载的脚本或CGI表单数据。然后,您可以实现清理方法,以确保对象是安全的并且在代码中的其他位置使用它们之前将它们取消它们。

另请参阅“What's the purpose of tainting Ruby objects?”。

答案 2 :(得分:1)

我发现此链接向我提供有关ruby中tainted数据的信息。

http://ruby.about.com/od/advancedruby/a/tainted.htm

  

“污点”对象是那些来自某种类型用户的对象   输入。从文件,键盘或网络,除非   object是程序中的文字或直接由程序创建的,   它会被污染。被污染的旗帜总是在你的物体上,   你所要做的就是在做任何不安全的事情之前检查一下。如果   你已经确认数据确实是安全的,你可以解开   对象。