我担心恶意用户在我的网站上注册时可能会添加额外的参数。我正在使用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::RegistrationsController
和email
的自定义视图:
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来忽略额外的参数(我只需要电子邮件和密码)当用户注册(或更新其配置文件,我想我会遇到同样的问题)?如果不可能,还有另一种解决方案吗?
答案 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