0

私はこの大量割り当ての問題について少し混乱しています。これが私の質問です

次の属性を持つユーザーモデルがあるとします。名前ログインパスワード電子メール

編集中に、更新メソッドがトリガーされます。

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params[:user]) 
   ....
end

私の頭の中では、パスワード/電子メール/ログインが危険にさらされたくないので、これらの属性のすべてではないにしてもほとんどを保護することは理にかなっています。だから私はモデルでこれを行います

attr_accessible:name

したがって、名前以外のすべての属性を一括で割り当てることはできません。

これを行うと、有効な編集フォームはどのように機能しますか?更新メソッド@user.email= params [:user] [:email]などで属性を1つずつ割り当てる必要がありますか?それとも私は何かを(おそらく)誤解していますか?

ありがとう!

編集:

具体的には:

通常、admin属性が保護された例が表示されます。そしてそれは理にかなっています。

しかし、パスワードや電子メールの属性はどうですか?それらは通常保護されていません。パスワードや電子メールが保護されないのはなぜですか?これは、誰かが電子メールをリセットしてパスワードをリセットしたり、パスワード属性をリセットしてシステムにアクセスしたりする可能性があることを意味する可能性があります。

4

2 に答える 2

1

このrailscastsを見るhttp://railscasts.com/episodes/26-hackers-love-mass-assignment/

あなたは大量割り当てのセキュリティについて間違った方法で考えています。attr_accessbileは、パスワード値を公開しません(filter_parameterを使用してその値を非表示にします)。

このように考えると、ユーザーフォームがあります。ユーザーがパスワードを使用してアカウントを作成できるようにしたいが、管理者として自分自身を追加できないようにしたい(SQLインジェクションまたはPOSTパラメーターの操作によってこれを行うことができる)。これを防ぐには、:name、:password、:emailをattr_accessibleに追加し、adminフィールドを省略します。

于 2012-07-06T00:35:51.603 に答える
0

ここで説明するように、コントローラーのパラメーターをフィルター処理するという考え方です。

class PeopleController < ActionController::Base
  # This will raise an ActiveModel::ForbiddenAttributes exception because it's using mass assignment
  # without an explicit permit step.
  def create
    Person.create(params[:person])
  end

  # This will pass with flying colors as long as there's a person key in the parameters, otherwise
  # it'll raise a ActionController::MissingParameter exception, which will get caught by 
  # ActionController::Base and turned into that 400 Bad Request reply.
  def update
    redirect_to current_account.people.find(params[:id]).tap do |person|
      person.update_attributes!(person_params)
    end
  end

  private
    # Using a private method to encapsulate the permissible parameters is just a good pattern
    # since you'll be able to reuse the same permit list between create and update. Also, you
    # can specialize this method with per-user checking of permissible attributes.
    def person_params
      params.required(:person).permit(:name, :age)
    end
end
于 2012-07-06T00:33:30.257 に答える