有没有办法绕过批量分配保护?

Posted

技术标签:

【中文标题】有没有办法绕过批量分配保护?【英文标题】:Is there a way to bypass mass assignment protection? 【发布时间】:2011-08-05 07:34:03 【问题描述】:

我有一个 Rails 3 应用程序,它对对象进行 JSON 编码,以便将它们存储在 Redis 键/值存储中。

当我检索对象时,我试图解码 JSON 并从数据中实例化它们,如下所示:

def decode(json)
  self.new(ActiveSupport::JSON.decode(json)["#self.name.downcase"])
end

问题在于,这样做涉及批量分配,对于我没有赋予 attr_writer 能力的属性,这是不允许的(我被告知这是有充分理由的!)。

有没有一种方法可以仅针对此操作绕过批量分配保护?

【问题讨论】:

【参考方案1】:

assign_attributeswithout_protection: true 似乎不那么具有侵入性:

user = User.new
user.assign_attributes( :name => 'Josh', :is_admin => true , :without_protection => true)
user.name       # => "Josh"
user.is_admin?  # => true

评论中提到的@tovodeverett,你也可以将它与new一起使用,就像这样在1行中

user = User.new( :name => 'Josh', :is_admin => true , :without_protection => true)

【讨论】:

这应该是答案,IMO! 另外,似乎可以在对new 的初始调用中传递without_protection: true(即user = User.new(name: 'Josh', is_admin: true, without_protection: true) 直接传递到create 操作时也可以工作:User.create(name: 'Josh', is_admin: true, without_protection: true)【参考方案2】:

编辑: kizzx2's 答案是更好的解决方案。

有点骇人听闻,但是...

self.new do |n|
  n.send "attributes=", JSON.decode( json )["#self.name.downcase"], false
end

这会调用属性 = 为 guard_protected_attributes 参数传递 false,这将跳过任何批量分配检查。

【讨论】:

感谢工作。不过,我必须修正两个小错字,“self”后面的点和 self.name.downcase 的大括号。【参考方案3】:

您也可以通过这种方式创建一个不进行批量分配的用户。

User.create do |user|
  user.name = "Josh"
end

你可能想把它放到一个方法中。

new_user(name)
  User.create do |user|
    user.name = name
  end
end

【讨论】:

以上是关于有没有办法绕过批量分配保护?的主要内容,如果未能解决你的问题,请参考以下文章

内存保护机制及绕过方法——通过伪造SEHOP链绕过SEHOP保护机制

有没有办法绕过 C++ 构造函数?

有没有办法绕过 Javascript / jQuery 的本地访问同源策略?

内存保护机制及绕过方案——利用未启用SafeSEH模块绕过SafeSEH

有没有办法绕过访问控制允许来源?

绕过MAC地址认证接入目标网络