首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby的Object#taint和Object#trust方法是什么?

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

Stack Overflow用户
提问于 2012-08-28 18:56:30
回答 2查看 8.1K关注 0票数 42

我读到了文档中的reading方法,并研究了这些方法。

  • taint
  • trust
  • untaint
  • untrust

我不知道他们是干什么的,我们在哪种情况下使用他们?有人用过吗?举个例子就好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-29 05:25:35

tainttrust是Ruby安全模型的一部分。在Ruby中,每个对象都带有一些标志,其中两个是可信标志和受污染标志。如何处理这些标志取决于所谓的安全级别。安全级别存储在$SAFE中。

程序中的每个线程和光纤都可以有自己的安全级别。安全级别从0到4不等,0不执行安全性,4强制执行这么多,只有在使用eval代码时才应该使用。您不能为$SAFE分配比它已经拥有的更低的值。此外,在UNIX系统中,Ruby脚本作为setuid运行,Ruby自动将安全级别设置为1。

玷污

当对象设置了受污染的标志时,粗略地说,这意味着对象来自不可靠的源,因此不能用于敏感操作。当安全级别为0时,污点标志将被忽略(但仍然设置,如果需要,您可以注意它)。有几种与污染有关的方法:

  • taint --使一个物体受到污染。您可以在所有级别上污染一个对象,安全级别4除外。
  • tainted? --检查一个对象是否被污染。
  • untaint --从物体上清除污点。这可以只在安全级别0、1和2中使用

下面是一个来自实用主义扒手(来源)的例子,它显示了污染:

代码语言:javascript
复制
# 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中这样做,就会得到一个错误:

代码语言:javascript
复制
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 --关于安全是否足够安全。

票数 70
EN

Stack Overflow用户

发布于 2012-08-29 06:12:01

我在ruby中找到了关于tainted数据的这个链接。

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

“受污染”对象是那些来自某种类型的用户输入的对象。无论是从文件、键盘还是网络,除非该对象是程序中的文字或程序直接创建的,否则它将受到污染。受污染的标志总是在你的对象上,你所要做的就是在你做任何不安全的事情之前检查它。如果您已经确认数据确实是安全的,那么就可以清除对象的污染。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12165664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档