Ruby污染对象从to_s返回没有污染的字符串

时间:2012-03-09 03:40:54

标签: ruby security oop

来自"Ruby Programming Language" - O'Reilly, Jan 2008

  

一旦对象被污染,任何从它派生的对象也将是   污点。

请考虑以下示例代码:

class Person

  attr_accessor :name

  def initialize name
    @name = name
  end

end

如果我运行以下内容:

p = Person.new("John Doe")
p.tainted?        # => false
p.taint
p.tainted?        # => true
p.to_s            # => <Person:0x000000014e0600 @name="John Doe">
p.to_s.tainted?   # => true
到目前为止,一切都很好。 to_s方法返回对象的字符串表示,并且它按预期的那样被污染。

然后我重新定义了这样的to_s方法:

class Person

  def to_s
    @name
  end

end

现在我再次运行上一次测试时:

p.tainted?        # => true
p.to_s            # => "John Doe"
p.to_s.tainted?   # => false

to_s方法现在生成了一个非污染的字符串。我在这里错过了什么?反正有没有调用super来保留功能?每次重新定义一个方法时,我是否必须声明返回的字符串是否被自己污染了?

class Person

  def to_s
    self.tainted? ? @name.taint : @name
  end

end

1 个答案:

答案 0 :(得分:2)

我会覆盖Person#taint:

class Person
  def initialize(name)
    @name = name
  end

  def taint
    @name.taint
    super
  end
end