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



关于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]]

有人知道为什么有些情人有污点而有些没有吗?如果有办法选择哪一列应该被污染?

编辑

谢谢你的回答。

@sgtLoyd:我刚刚尝试手动更新国家/地区。下面是正在发生的事情:

>> 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列没有被污染,而有些则…

非常感谢!

是否污染是Ruby的Object类的方法。如果你想在Rails应用程序中找到哪些对象被修改了,你可能正在寻找被修改了

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

AFAIK,Rails不使用污点,它跟踪更改和html_safe条件,但我没有看到任何关于污点的提及。tant的ruby文档说,当它来自外部源时,它应该被污染,我想这与正在使用的sql库有关。但如果没有看到图书馆本身,我就猜不出为什么有些被污染了,有些没有。

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

来自Ruby 编程

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

在您的示例中,像last_login_atpassword_saltcreated_at这样的列是单独在内部创建和处理的,不使用任何用户输入。phoneemailcountry等都是从用户输入中派生出来的,因此它们本质上是不可信的。

相关内容

  • 没有找到相关文章

最新更新