【问题标题】:is necessary mass assignment protection in a model without controller?在没有控制器的模型中是否有必要的质量分配保护?
【发布时间】:2013-02-12 19:33:08
【问题描述】:

我有一个这样的模型:

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 数据更新了我的模型的数据。我认为不可能用 mass-assign 进行攻击,因为我已经获得了 action 方法中的信息,但我真的是使用 rails 的初学者,我想确认我的假设是否属实。

【问题讨论】:

  • 如果该方法修改了列表中提到的属性以外的任何属性,rails 会抛出错误。如果没有,一切都会正常工作。它与控制器无关。您不能从代码库中的任何位置修改不可访问的属性。
  • 这个方法正在修改Page类的所有属性。它们必须是可访问的,因为我需要在这个类中写一些来自 facebook 的信息。在代码中没有 PagesController 或 pages#update 方法,只有这个。

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


【解决方案1】:

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

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

由于在您的情况下,更新针对的是列入白名单的字段,因此您的方法运行良好。当您的方法尝试更新任何其他属性(例如 date_of_birth)时,该方法将失败并提示 date_of_birth 无法批量更新。

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

  1. 呈现的数据可读且不难看(某些用户输入往往如此)
  2. 表格中的数据是 html 安全的
  3. 不会导致任何类型的code-injections

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多