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

Pri*_*ain 39 ruby

我正在阅读文档中关于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 - 关于安全是否足够安全.


Max*_*Max 5

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

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

另请参阅" 污染Ruby对象的目的是什么? ".