阻止为User对象的实例获取密码属性值

时间:2014-05-12 15:51:27

标签: ruby-on-rails ruby security rails-models

我在:show的{​​{1}}行动中有这个。

users_controller

但是在users表中有一些我不想从def show @user = User.find(params[:id]) end 实例变量访问的列。

@user列和encrypted_password列。我可以在模型或控制器上执行哪些操作,以确保salt没有@userpassword值。

我希望当我执行salt@user.password时,它会返回@user.salt或无法破坏用户安全性的内容。

4 个答案:

答案 0 :(得分:3)

  1. 限制您的Ruby代码从数据库中获取一些数据几乎不会增强安全性 - 黑客可能会通过您的ruby代码访问您的数据库而不是,但是通过直接攻击您的数据库......
  2. 如果数据库中保存的所有内容都是加密的密码和盐(两者都需要对用户进行身份验证) - 你应该没问题,两者都不足以让人知道用户的密码(假设加密足够强,至少不容易)
  3. 如果您希望额外小心,可以将salt保存在单独的存储库中,而不是加密的密码存储库。这样黑客就必须闯入两个存储库,甚至开始强制用户密码。

答案 1 :(得分:2)

不要以未加密的格式将密码存储在数据库中。如初。

Hiding an attribute in an ActiveRecord model提供了一些有关如何隐藏模型类中各种属性的基本信息。

最好的方法是从一些中间对象为你的控制器提供一个外观,并且该方面基本上只暴露控制器需要操作的那些字段。

答案 2 :(得分:0)

您可以在模型中添加after_find回调...

class User << ActiveRecord::Base
  after_find :nil_secure_fields

  def nil_secure_fields
    password = nil
    salt = nil
  end
end

如果记录已更新,您需要确保密码和salt属性不包含在要更新的属性中。

答案 3 :(得分:0)

对于User模型添加

class << self
  def find_secure(id)
    user = self.find(id)
    user.secure_attributes!
    user
  end
end

def secure_attributes!
  @attributes_secure = true
end

def secure_attributes?
  !!@attributes_secure
end

def encrypted_password
  secure_attributes? ? nil : super
end

def salt
  secure_attributes? ? nil : super
end

现在,您可以使用find_secure方法代替find,这将限制对安全属性的访问。

PS这并不能避免存储加密密码的需要。