2

私は最近 Rails を使用していますが、このMassAssignment エラーは、子を で保存したいシナリオで頻繁に見られparent_idます。

attr_accessbileこれを修正するために、関連する外部キーをリストに追加することを誰もが提案しています。

そうすることで解決できましたが、内部で何が起こっているのかわかりません。foreign_keyホワイトリストに登録するとセキュリティ上の問題が生じるというのは本当ですか?

次のモデルのシナリオを考えてみましょう。

class BusinessType < ActiveRecord ::Base
      has_one :business_form
      validates :name, :presence => true
      attr_accesible :name, :enabled  
end

class BusinessForm < ActiveRecord ::Base
      belongs_to :business_type
      validates :name, :presence => true
      validates_associated :business_type, :presence=>true
      attr_accessible :name, :enabled
end

上記の場合、リストbusiness_formなしbusiness_type_idで保存しようとするattr_accessibleと、大量割り当てエラーが発生します。business_typeホワイトリストに追加すると、選択ボックスが空のままでフォームが送信されても​​、エラーメッセージは表示されません。

レールのこの領域に光を当ててください。詳細を説明するリンクがあれば教えてください。

4

2 に答える 2

4

はい、セキュリティ上の問題が発生します。誰かがあなたの BusinessFormController#create に投稿でき、投稿の一部として「business_type_id」を渡したとします。コントローラーが次のようなことを行うだけでレコードを作成する場合:

def create
  BusinessForm.create(params[:business_form])
end

次に、ユーザーがそのフォームのビジネス タイプを指定できるようにします。あなたのサイトがどのように機能するかはわかりませんが、特定のユーザーが特定の種類のフォームの作成を許可されている可能性があるため、これは問題になる可能性があります。外部キーを attr_accessible に追加する際の主な懸念は、ハッカー (Web プログラミングをまったく知っている人) がこの新しく作成されたレコードを外部キー オブジェクトのいずれかと関連付けることができるようになることです。この場合、気にしないか、制限されていない場合は、問題にならない可能性があります。

それでも人々の言うことに従いたい場合は、"business_type_id" なしで attr_accessible を保持しないでください。ただし、次のようにアクションを記述します。

def create
  bf = BusinessForm.new({:business_type_id => params[:business_form][:business_type_id]})
  bf.attributes=(params[:business_form].except(:business_type_id))
  bf.create
end
于 2012-09-11T06:58:55.803 に答える
0

Attr_accessible は非常に単純です。そのフィールドが attr_accessible によってホワイトリストに登録されていない限り、Web フォームから送信された値を割り当てることはできません。

外部キーへの一括割り当てのセキュリティへの影響については、次のシナリオを考慮する必要があります。

  1. 外部キーを任意の可能な値に設定することは許容されます。一括割り当てによるセキュリティ上の脅威はありません。

  2. 外部キーは、特定の数の許容値の 1 つでなければなりません。この場合、フィルターを使用して、フォームから渡された値が受け入れられることを確認し、受け入れられない場合は拒否します。

  3. 外部キーは常に予測可能な値になります。この場合、一括割り当てを許可せず、コードを使用して外部キーを割り当てます。

于 2012-09-11T13:01:14.207 に答える