1

私の懸念は、悪意のあるユーザーが私のサイトに登録するときに余分なパラメーターを追加する可能性についてです。Rails 3.2.8 と Devise 2.1.2 を使用しています。属性を持つクラスUserがありますadmin

user.rb

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

schema.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、 と のカスタム ビューを使用し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

管理フィールドを一括割り当てから保護する必要があります。これをモデルに追加する必要があります。 attr_protected :admin

詳細はこちら: http://apidock.com/rails/v3.2.8/ActiveModel/MassAssignmentSecurity/ClassMethods/attr_protected

于 2012-09-10T17:13:32.390 に答える
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のドキュメントをチェックして、気に入るかどうかを確認してください. ドキュメンテーションを考案する

于 2012-10-02T18:10:03.120 に答える