如何使password_digest无法访问?

时间:2014-01-01 19:21:03

标签: ruby-on-rails validation

rails new blah
cd blah
rails g model user password_digest:string
rake db:migrate

应用程序/模型/ user.rb

class User
  has_secure_password
end

(最后一步是在Gemfile中启用bcrypt-ruby然后捆绑安装)

所以现在我们有一个空白的rails 4.0设置,用户有一个安全的密码。让我们看看验证是如何工作的(如果我们运行rails c并尝试一些东西):

User.new.valid?
=> false
# good

User.new(:password => "k").valid?
=> false
# good - needs confirmation

user = User.new(:password => "k", :password_confirmation => "k")
=> #<User id: nil, password_digest: "$2a$10$csB375UE7yWANd1I0SJqf.UqwL/5URr8lyjCKebn3FXf...", created_at: nil, updated_at: nil>
# good - it hashed our password perfectly
user.valid? 
=> true
# good - exactly how it should work

user = User.new(:password => "k", :password_digest => "owned", :password_confirmation => "k")
=> #<User id: nil, password_digest: "owned", created_at: nil, updated_at: nil>
# I just directly specified the digest... that shouldn't be possible?
user.valid? 
=> true
# bad.. very bad... they just let us change it directly!
你知道发生了什么事吗?看看最后一次测试,我们正确设置了密码和确认 - 这就是为什么它有效。但我们也直接设置了密码摘要,其中写了密码和我们提供的确认信息,并允许我直接修改值...以及该用户保留有效 :(

有哪些安全措施可以防止直接修改password_digest?设置它应该没有效果或应该使该用户对象无效。

PS:如果有人知道更好的标签,请编辑:D

1 个答案:

答案 0 :(得分:2)

使用强参数的方法将安全性从模型移动到控制器,理由是除了通过控制器之外无法访问模型。根据设计, 在模型级别上没有任何保护可以传递什么参数。