Rails默认情况下如何污染活动记录列?

时间:2012-03-15 21:14:31

标签: ruby-on-rails ruby taint

关于Rails魔术的问题:

我在玩IRB并受到污染?方法,然后我只是做了以下:

>> User.first.attributes.collect { |column, value| [column, value.tainted?] }
=> [["phone", true], ["state", false], ["persistence_token", true], ["last_login_ip", true], ["country", true], ["login_count", false], ["last_request_at", false], ["id", false], ["forname", true], ["current_login_at", false], ["name", true]]

有谁知道为什么有些参数被污染了,有些则没有?如果有办法选择哪个列应该被污染?

编辑

感谢您的回答。

@sgtFloyd:我刚刚尝试手动更新国家/地区。这就是发生的事情:

>> u = User.first
>> u.country = "USA"
=> "USA"
>> u.country.tainted?
=> false
>> u.save
=> true
>> u.country.tainted?
=> false
>> u.reload
>> u.country.tainted?
=> true
>> u.country.class
=> String # it's also string in the database

编辑2

我删除了User模型中的所有内容,并且一些String列不会出现污点,而有些则会...

非常感谢!

3 个答案:

答案 0 :(得分:2)

污点污染?是Ruby的Object类的方法。如果您想在Rails应用中查找已修改的对象,您可能正在寻找已更改?

@customer.email = 'new@email.com'
do_something if @customer.email_changed? 

答案 1 :(得分:2)

AFAIK,Rails没有使用污点,它跟踪变化和html_safe条件,但我还没有看到任何污点。用于污染的ruby文档说当它来自外部源时它应该被污染,我猜这与使用的sql库有关。但是,如果没有看到图书馆本身,我无法猜测为什么有些人被污染而有些人没有。

在我的项目上运行该代码会出现所有错误。它可能取决于您运行的ruby / rails等版本,并且由于它不是由rails定义的,因此可能不适合依赖。

答案 2 :(得分:2)

来自Programming Ruby

  

从某些外部源派生的任何Ruby对象(例如,a   从文件或环境变量读取的字符串是自动的   被标记为被污染。如果您的程序使用受污染的对象   派生出一个新对象,那么新对象也会被污染......

在您的示例中,last_login_atpassword_saltcreated_at等列仅在内部创建和处理,无需使用任何用户输入。 phoneemailcountry等来自用户输入,因此它们本质上是不值得信任的。