关于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_at
、password_salt
和created_at
这样的列是单独在内部创建和处理的,不使用任何用户输入。phone
、email
、country
等都是从用户输入中派生出来的,因此它们本质上是不可信的。