安全性 - 使用Devise创建用户时过滤属性

时间:2012-09-10 17:05:04

标签: ruby-on-rails security devise

我担心恶意用户在我的网站上注册时可能会添加额外的参数。我正在使用Rails 3.2.8和Devise 2.1.2。我有一个User属性<{1}}的课程{/ 1}

user.rb

admin

schema.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable, :trackable,
     :validatable, :token_authenticatable, :lockable
end

我使用提供的create_table "users", :force => true do |t| t.boolean "admin" t.string "email", :null => false t.string "encrypted_password", :default => "", :null => false # other devise columns are not relevant for the question... end 来注册用户,使用Devise::RegistrationsControlleremail的自定义视图:

password

我工作得很好,但如果恶意用户在帖子请求中添加值为<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <div class="form_line"> <%= f.label :email, 'Email' %> <%= f.email_field :email %> </div> <div class="form_line"> <%= f.label :password, 'Password' %> <%= f.password_field :password %> </div> <div class="form_line"> <%= f.label :password_confirmation, 'Password confirmation' %> <%= f.password_field :password_confirmation %> </div> <div class="actions"> <%= f.submit "Register", class: 'button' %> </div> <% end %> 的参数admin,则会使用管理员权限创建用户。

true

这是我网站的安全漏洞。我可以配置Devise来忽略额外的参数(我只需要电子邮件和密码)当用户注册(或更新其配置文件,我想我会遇到同样的问题)?如果不可能,还有另一种解决方案吗?

2 个答案:

答案 0 :(得分:3)

您需要保护管理字段不受批量分配。您应该将其添加到您的模型中: attr_protected :admin

在此处阅读更多内容:http://apidock.com/rails/v3.2.8/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_protected

答案 1 :(得分:0)

设计提供了配置多个模型进行身份验证的可能性,我认为这是解决问题的更好方法。

“Devise允许您根据需要设置任意数量的角色。例如,您可能拥有User模型,并且还希望Admin模型只具有身份验证和可超时的功能。如果是这样,请按照以下步骤操作:”

# Create a migration with the required fields
create_table :admins do |t|
  t.string :email
  t.string :encrypted_password
  t.timestamps
end

# Inside your Admin model
devise :database_authenticatable, :timeoutable

# Inside your routes
devise_for :admins

# Inside your protected controller
before_filter :authenticate_admin!

# Inside your controllers and views
admin_signed_in?
current_admin
admin_session

如果您和任何有类似疑虑的人,请花一些时间查看设计文档,看看您是否喜欢它。devise documentation