18

什么时候需要对 Ruby 对象进行污染,什么时候应该对它们进行去污染?受污染对象的概念如何使 Ruby 脚本在安全模式下运行?任何人都可以详细说明这一点以通过一些代码片段来明确这个概念吗?

4

1 回答 1

20

什么是污点?

根据定义,用户输入受到污染。例如:

string = gets
string.tainted?
# => true

您也可以手动污染对象。

string = 'Not yet tainted.'
string.tainted?
# => false

(string = 'Explicitly taint me!').taint
string.tainted?
# => true

为什么不污染对象?

通常,只有在验证和/或清理对象之后,您才会对其进行净化。对于您不想在不受信任的字符串或其他对象上运行的某些操作,或者当您的安全级别需要未污染的对象执行所需的操作时,取消污染对象会将其标记为“安全”。

清除对象

清除对象的最简单方法是对其调用Object#untaint方法。例如,如果您的字符串变量包含一个被污染的对象,那么:

(string = "Let's taint this string!").taint
string.untaint.tainted?
# => false

有关受污染对象的更多信息

您可以在Programming Ruby的 Safe章节中的Locking Ruby 中找到有关受污染对象的更多信息。

于 2013-01-11T15:33:46.963 回答