2011-06-21 6 views
6

モデルでattr_accessibleを使用して、質量割り当ての問題を解決したかったのです。私はそれがどのように機能し、できる限り研究したのか理解しています。これはどのように質量割り当てを停止するのですか?

update_attributes(params [:my_form])またはcreate(params [:my_form])を使用してフィールドを1つずつ設定することの違いはわかりません。両方とも脆弱ではない?

attr_accessible有し、かつ、これをやっていないの違いは何です...

@model_object = ModelObject.new 
@model_object.create(params[:model_object_params]) 

そしてattr_accessible持つとこれをやって...

@model_object = ModelObject.new 
@model_object.field1 = params[:model_object_params][:field1] 
@model_object.field2 = params[:model_object_params][:field2] 
@model_object.field3 = params[:model_object_params][:field3] 
@model_object.save! 

は両方作成するこれらの方法ではないです脆弱性と同様に記録しますか?ハッカー/クラッカーは、これらの方法の両方にURLを送信することができ、両方とも同じように機能するでしょうか?

また、attr_accessibleを使用して、フィールドを1つずつ更新して別のことを行うか、何らかの形でより安全になるでしょうか?

私がattr_accessibleを使用して見つけたこれらすべての方法は、私には分かりません。同じことを2つの異なるやり方で行っているようです。私は何が欠けていますか?

ありがとうございました。

答えて

7

、それは「質量割り当て」を防ぐことはできません。

「マス割り当て」は、Railsがモデル内の属性に値を割り当てるときに使用される用語です。これは通常、コントローラで行われ、名前と値はparamsです。

あなた自身を割り当てているときは、それはまた「質量割り当て」です。この場合は何を割り当てるのか、そうでないのかを細かく制御できます。したがって、定型的な代入コードを書くことを節約するために、Railsはattr_accesibleを提供します。それが使用されているかを確認するには

推測ActivityLogモデルはuser_ip_addressという属性を持っていること。

ここで、user_ip_addressはモデル内の属性であり、となる可能性があります。これは、質量割り当てまたは「自己圧延質量割り当て」によって割り当てられます。

どちらの場合も間違っています - ユーザーが入力した入力にその属性の値を設定したくない場合。

代わりに、ユーザーの実際のIPアドレスを見つけて、その値を割り当てたい( の値を無視して、params)。したがって、user_ip_addressattr_accessibleから除外し、自分で割り当てます。ユーザーは、変更attr_accessibleを使用して、リストから除外することはできないことをすべての情報について

attr_accessible :all_attributes_except_user_ip_address 

@al = ActivityLog.new(params[:model_object_params]) 
@al.user_ip_address = get_origin_user_ip_address 
@al.save 

+0

ああ私がやっていることは、created_byやcreator_idフィールドが設定されていないようにしますが、細かい制御がなければ、送信されているフィールドや割り当てられているフィールドに悪質なデータが残っている可能性があります。私はナッツを運転していた。これらすべての例は基本的に、params hashを渡すのではなく、手動で各フィールドを割り当てただけです。今私は、感謝を参照してください。 – dsmorey

2

ここでの考え方は、特定のモデルで受け入れるパラメータを制限することです。次に、検証やその他のコードを使って、期待値に合っているかどうかをテストすることができます。

Attr_accessibleは、モデルの「表面」を受け入れて慎重に確認することを意図しています。この方法では、自動的に注入されたパラメータを同様に無視することができます。役割はattr_accessibleに記載されていない属性ので、あなたのモデルに

user.update_attributes(params[:user]) 

をその機能を追加する場合の役割=>「admin」を、ユーザーの試みはなるために管理者は無益です。

コントローラ内の各パラメータ値を確認する代わりに、検証ロジックを1か所(モデル)で処理する必要があります。

3

短い答えは、暗黙的にfield4が設定されていないことを示しています。

attr_accessibleがないと、ハッカーがあなたのフォームにないフィールドを更新する可能性があります。 attr_accessibleでこれは不可能です。

など。ユーザーモデルがフィールドis_adminを持っている場合は、ハッカーが掲示することにより、新しい管理者を作成しようとすることができます:attr_accessibleが設定されている(と明らかにそれはis_adminを含むべきではありません)

params[:user][:is_admin] = true 

場合、これは不可能です。あなたの例について

:お使いのモデルのみfield1field2field3を持っており、あなたが保護したい他のデータベース列が存在しない場合は、attr_accessibleを使用する必要はありません。これが明らかになることを願っています。

ただ覚えている:任意の予防策なし

を Model.new(のparams [:モデル])は 攻撃者が任意のデータベース列の 値を設定することができます。

出典:http://guides.rubyonrails.org/security.html#mass-assignmentあなたはそれをやっているように

2

マス課題はあなたがコントロールするものではなく、あなたがコントロールするものです。それは物事をより簡単でクリーンなものにする良い機能ですが、質量割り当てによって何が設定されるかを制御する何らかの能力がなければ、潜在的なセキュリティホールになります。 attr_accessibleは、他に言及したように、その制御を提供する。

関連する問題