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つの異なる方法で行っているようです。私は何が欠けていますか?

ありがとう。

4

4 に答える 4

7

あなたがやっている方法では、「大量割り当て」を妨げません。

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

自分で割り当てを行う場合、ある意味では「一括割り当て」でもあります。ただし、この場合、何を割り当て、何を割り当てないかを細かく制御できます。そのため、定型的な割り当てコードを書く手間を省くために、Rails は、attr_accesible同じ制御でより少ないコードを提供します。

使用方法を確認するには:

モデルにというActivityLog属性があるとしuser_ip_addressます。

現在、user_ip_addressはモデルの属性であり、質量割り当てまたは「自己ロール質量割り当て」によって割り当てることができます。

しかし、どちらの場合も、それは間違っています。ユーザーが指定した入力によってその属性の値が設定されることは望ましくありません。

代わりに、常にユーザーの実際の IP アドレスを見つけて、その値を割り当てます ( の値は無視しますparams)。したがって、除外user_ip_addressattr_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

ユーザーが変更できない情報については、それを使用attr_accessibleしてリストから除外します。

于 2011-06-21T03:47:24.320 に答える
3

簡単な答えは、field4暗黙的に設定されないようにすることです。

違いはattr_accessible、ハッカーがいなくても、フォームにないフィールドを更新できることです。これattr_accessibleでは無理。

たとえば、ユーザー モデルに field があるis_admin場合、ハッカーは次のように投稿して新しい管理者を作成しようとする可能性があります。

params[:user][:is_admin] = true

が設定されている場合attr_accessible(そして明らかに を含むべきではありませんis_admin)、これは不可能です。

例について: モデルに のみがあり、field1保護するデータベース列が他にない場合、 を使用する必要はありません。これが明確になることを願っています。field2field3attr_accessible

覚えとけ:

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

ソース: http://guides.rubyonrails.org/security.html#mass-assignment

于 2011-06-21T03:38:06.977 に答える
2

Mass assignment isn't something you prevent, it's something you control. It's a good feature, one that makes things easier and cleaner, but without some kind of ability to control what gets set via mass assignment it's a potential security hole. attr_accessible, as others have mentioned, provides that control.

于 2011-06-21T04:21:35.873 に答える
2

ここでの考え方は、特定のモデルに対して受け入れるパラメーターを制限することです。次に、検証またはその他のコードを使用してそれぞれをテストし、期待値に適合することを確認できます。

Attr_accessible は、モデルの「表面」を、受け入れて慎重にチェックするつもりのものに制限することを目的としています。このようにして、モデルにその機能を追加した場合に、 :roles => "admin" のような注入されたパラメーターを自動的に無視できます

user.update_attributes(params[:user])

ロール属性が attr_accessible にリストされていないため、ユーザーが管理者になろうとしても無駄です。

コントローラーの各パラメーター値をチェックするのではなく、1 つの場所 (モデル) で検証ロジックを処理する必要があります。

于 2011-06-21T03:37:17.940 に答える