在没有控制器的模型中是必要的质量分配保护?

时间:2013-02-12 19:33:08

标签: ruby-on-rails facebook facebook-oauth rails-activerecord mass-assignment

我有一个这样的模型:

class Page < ActiveRecord::Base
  attr_accessible :page_id, :name, :page_url, :username
end

并且它没有相关的控制器,但在另一个控制器中我正在执行此代码:

fgraph  = Koala::Facebook::API.new(ftoken)

@pages = fgraph.fql_query("select XXX from pages where xxx")

@pages.each do |p|

    newpage = Page.find_or_initialize_by_page_id("#{p["page_id"]}")
    newpage.update_attributes(
      name: p["name"],
      username: p["username"],
      page_url: p["page_url"]
      )
end

这最后一行用facebook数据更新我模型的数据。因为我已经在动作方法中获得了信息,所以我觉得用质量分配攻击是不可能的,但我真的很喜欢使用rails,我想确认我的supossition是否属实。

1 个答案:

答案 0 :(得分:0)

是的。 确实,白名单属性可以通过批量分配从其他任何地方进行更新。

update_attributes是一个rails方法,它接收attr-value对的散列并尝试将其应用于对象并保存。在save成功返回之前,运行所有model validations以查看是否可以执行保存操作。

因为在您的情况下,更新定位到列入白名单的字段,您的方法运行正常。您的方法尝试更新任何其他属性的日期,例如date_of_birth,该方法将失败,说date_of_birth无法进行批量更新。

为了数据的安全起见,最好在写入时或读取时使用rails-sanitizers。这将确保

  1. 提供的数据是可读的而不是丑陋的(一些用户输入的往往是)
  2. 表中的数据是html-safe
  3. 不会导致任何code-injections