2012-08-28 40 views
31

我读到有关在docs Ruby的字符串方法来到翻过方法什么是Ruby的对象#污点和对象#信任方法?

  • taint
  • trust
  • untaint
  • untrust

我不知道他们做了什么,我们使用它们的情况是什么?有没有人使用过其中的任何一个例子会很好。

+1

他们是Ruby的安全模型的一部分。 – Linuxios

+0

好的,我们有没有在某些情况下使用它,你有没有机会混淆它。词安全本身使它更有趣:) – PriteshJ

+0

我没有与他们合作,但我可能会很快给出答案。这是我在哪里的夜晚,所以也许在早上。 – Linuxios

回答

48

tainttrust是Ruby安全模型的一部分。在Ruby中,每个对象都带有几个标志,它们中有两个是Trusted标志和Tainted标志。这些标志如何起作用取决于所谓的安全级别。安全级别存储在$SAFE中。

程序中的每个线程和光纤都可以拥有自己的安全级别。安全级别范围从0到4,0强制执行没有安全性,4强制执行非常多,只能在您使用eval代码时使用。你不能分配一个较低的值到$SAFE比它已经有。此外,在其中一个Ruby脚本运行作为setuid UNIX系统中,红宝石会自动将安全级别设置为1

污点

当一个对象有它的污点标志设置,这意味着,粗略,该对象是从哪里来的一个不可靠的来源,因此不能用于敏感操作。当安全级别为0时,污染标志被忽略(但仍然设置,如果你愿意,可以注意它)。有几种方法与污点有关:

  • taint - 使对象变脏。除了安全级别4,您可以在所有级别上污染对象。
  • tainted? - 检查对象是否受污染。
  • untaint - 从对象中移除污点。这可以只有用于安全级别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/1887006


这里有一些更多的资源: http://phrogz.net/ProgrammingRuby/taint.html - 对安全水平的一些伟大的东西,但我认为这1.8的 - 有一个更新版本1.9,单单只出现在书的印刷版本。

http://www.ruby-forum.com/topic/79295 - 在安全是否足够安全。

+1

你保持你的话,给我带来了一些很棒的东西的荣誉,它是一个很好的答案我正在寻找,谢谢 – PriteshJ

+0

@PriteshJ:当然。很高兴我能帮上忙。 – Linuxios

+0

我找到了一个很好的链接并将其添加为回答检查出可能是你能帮助更多的人喜欢我与:) – PriteshJ

4

tainttrust每个都设置了一个标志,表示对象随处携带它。我可以告诉的唯一区别是(从ruby-doc.org),当给定受污染的对象时,某些方法调用的行为会有所不同,而信任似乎完全取决于程序员解释。

污点的主要目的是将用户输入标记为潜在危险,例如一个动态加载的脚本或CGI表单数据。然后实施清理方法,确保对象在代码中的其他地方使用之前是安全的并将它们解除。另请参阅“What's the purpose of tainting Ruby objects?”。

0

我发现这个链接给我信息有关红宝石tainted数据。

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

"Tainted" objects are those that have come from some type of user input. Either from a file, the keyboard or the network, unless the object is a literal in the program or created by the program directly, it will be tainted. The tainted flag is always there on your objects, all you have to do is check it before you do anything unsafe. If you've confirmed that the data is indeed safe, you can then untaint the object.

+0

链接重定向到https://www.thoughtco.com/what-is-programming-958331 – infomaniac

+0

可悲的是肯定的@infomaniac。它一开始工作 – PriteshJ

相关问题