15

一括代入によるセキュリティ リスクを防ぐ公式の方法は、attr_accessibleを使用することです。ただし、一部のプログラマーは、これはモデルの仕事ではないと感じています (または少なくともモデルの仕事ではありません)。コントローラーでこれを行う最も簡単な方法は、paramsハッシュをスライスすることです。

@user = User.update_attributes(params[:user].slice(:name))

ただし、ドキュメントには次のように記載されています。

attr_accessible の代わりに Hash#except または Hash#slice を使用して属性をサニタイズしても、十分な保護が得られないことに注意してください。

何故ですか?パラメータのホワイトリストスライスが十分な保護を提供しないのはなぜですか?

更新: Rails 4.0では、パラメーターの洗練されたスライスである strong-parameters が出荷される予定です。

4

5 に答える 5

6

コントローラーでのスライスと例外の問題はaccept_nested_attributes_for、モデルで と組み合わせて発生する可能性があります。入れ子になった属性を使用する場合は、すべての場所でパラメーターをスライスする必要があります。ここでは、コントローラーでパラメーターを更新します。これは、特に深く入れ子になったシナリオでは、常に最も簡単な作業ではありません。使用attr_accesibleすると、この問題はありません。

于 2012-03-07T09:52:08.563 に答える
4

Rails 4以降、パラメーターのスライスは、一括割り当てのセキュリティを処理するための推奨される方法になります。Railsコアチームはこれに対処するためのプラグインをすでに開発しており、ネストされた属性と署名されたフォームのサポートの統合に取り組んでいます。間違いなくチェックすべきもの:http ://weblog.rubyonrails.org/2012/3/21/strong-parameters/

于 2012-03-23T12:55:44.580 に答える
4

コントローラーでのスライスとホワイトリストのみの DHH からの興味深い要点:

https://gist.github.com/1975644

class PostsController < ActionController::Base
  def create
    Post.create(post_params)
  end

  def update
    Post.find(params[:id]).update_attributes!(post_params)
  end

  private
    def post_params
      params[:post].slice(:title, :content)
    end
end

コントローラー内でこれを管理する必要性を強調するコメント:

https://gist.github.com/1975644#gistcomment-88369

私は個人的に両方を適用します-attr_accessibleとsliceを適用して、予期しないものが通過しないようにします。ブラックリストだけに頼らないでください!

于 2012-11-29T20:52:02.180 に答える
2

params ハッシュから :name を削除するだけで、そのアクションの属性が設定されなくなります。保護したことを覚えているアクションに対してのみ機能します。

ただし、この方法では、アソシエーション用に自動的に追加されるすべてのメソッドを使用した悪用を防ぐことはできません。

class User < ActiveRecord::Base
  has_many :comments
end

paramsから属性comments_idsを削除しても、誰かが属性を設定することに対して脆弱なままになります。comments

関連付けには非常に多くのメソッドが追加されており、将来変更される可能性があるため、ベスト プラクティスは を使用してモデルの属性を保護することですattr_accessible。これにより、この種の攻撃を最も効果的に阻止できます。

于 2011-09-20T10:31:37.787 に答える
0

@toklandあなたの最後のコメントは、ある程度正しくありません。あなたのウェブサイトに、データが出入りする唯一のエントリポイントとしてブラウザがある場合を除きます.

Web アプリケーションに API がある場合、またはコントローラー レベルで他の API の保護と通信する場合、その背後に穴が残り、他のソースからのすべてのデータはサニタイズまたはチェックされません。application.rb で大量割り当て保護をオンにし、ActiveSupport FormHelpers を Django/Python スタイルのように機能するように拡張することをお勧めします。

于 2012-05-03T15:27:05.817 に答える