1

我担心恶意用户在我的网站上注册时添加额外参数的可能性。我正在使用 Rails 3.2.8 和 Devise 2.1.2。我有一个User带有admin属性的类

用户.rb

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

架构.rb

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的用户注册,以及带有 and 的自定义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,那么用户就会以管理员权限创建。

Started POST "/users" for 127.0.0.1 at 2012-09-10 18:46:15 +0200
Processing by RegistrationsController#create as HTML
  Parameters: { "user"=>{"email"=>"test@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "admin"=>"true" }

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

4

2 回答 2

3

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

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

于 2012-09-10T17:13:32.390 回答
0

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

“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

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

于 2012-10-02T18:10:03.120 回答