40

我正在阅读文档中有关 Ruby 字符串方法的内容并遇到了这些方法

  • taint
  • trust
  • untaint
  • untrust

我不知道它们是做什么的,我们在什么情况下使用它们?有人用过吗?例子会很好。

4

3 回答 3

68

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 镐(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——关于安全是否足够安全。

于 2012-08-29T05:25:35.623 回答
5

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

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

另请参阅“污染 Ruby 对象的目的是什么? ”。

于 2012-08-29T04:03:40.243 回答
1

I found this link to me informative about tainted Data in ruby.

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.

于 2012-08-29T06:12:01.083 回答