5

私は Rails のセキュリティ上の懸念について調べてきましたが、私が最も懸念しているのは大量割り当てです。私のアプリケーションは attr_accessible を使用していますが、公開された関係を処理する最善の方法が何であるかを完全に知っているかどうかはわかりません。基本的なコンテンツ作成/所有 Web サイトがあると仮定しましょう。ユーザーはブログ投稿を作成し、そのブログ投稿に関連付けられた 1 つのカテゴリを持つことができます。

したがって、次の 3 つのモデルがあります。

  • ユーザー
  • 投稿:ユーザーとカテゴリに属します
  • カテゴリ:ユーザーに属します

私は、category_id の一括割り当てを許可しているので、ユーザーはそれを無効にしたり、自分のカテゴリの 1 つに変更したり、一括割り当てによって、他の誰かのカテゴリに変更したりできると思います。それは、私が進むべき最善の方法が何であるかについて、私がちょっと確信が持てないところです.

私が調査したリソース (特にrailscast #178とその railscast から提供されたリソース) の両方で、関連付けは一括割り当て可能であってはならないと述べられていますが、これは理にかなっています。ユーザーが投稿のカテゴリを簡単に変更できるようにする方法が他にないかどうかはわかりません。

これを解決する最善の方法についてのアイデアはありますか? 私はそれを間違った方法で見ていますか?

更新:私の懸念をもう少し明確にすることを願っています。

私がポストにいるとしましょう。次のようなものが必要ですか。

def create
  @post = Post.new(params[:category])

  @post.user_id = current_user.id

  # CHECK HERE IF REQUESTED CATEGORY_ID IS OWNED BY USER

  # continue on as normal here
end

それは多くの仕事のように見えますか?更新アクションと作成アクションの両方で、すべてのコントローラーでそれを確認する必要があります。belongs_to 関係は 1 つだけではないことに注意してください。

4

2 に答える 2

5

あなたのユーザーは、ある種の編集フォームを介してそれを変更できると思います。

それに基づいて、Mass Assignment は実際には、curl などでアプリをいじろうとする悪質なタイプ向けです。私は彼らをカールキディと呼んでいます。

つまり、attr_protected- (変更してほしくないフィールドをここに入力します) または子供のお気に入りattr_accessible(変更してもよいフィールド) を使用する場合です。

両方の引数が聞こえますがattr_protected :user_id、モデルで使用し、次に CategoryController#create アクションで次のようなことができます

def create
  @category = Category.new(params[:category])

  @category.user_id = current_user.id
  respond_to do |format|
....#continue on as normal here
end
于 2010-01-29T02:51:35.877 に答える
0

わかりましたので、少し検索して、最終的に実行可能なものを思いつきました。可能な限りロジックをコントローラーから遠ざけるのが好きなので、このソリューションはモデルベースのソリューションです。

# Post.rb
validates_each :asset_category_id do |record, attr, value|
  self.validates_associated_permission(record, attr, value)
end

# This can obviously be put in a base class/utility class of some sort.
def self.validates_associated_permission(record, attr, value)
  return if value.blank?
  class_string = attr.to_s.gsub(/_id$/, '')
  klass = class_string.camelize.constantize

  # Check here that the associated record is the users
  # I'm leaving this part as pseudo code as everyone's auth code is
  # unique.
  if klass.find_by_id(value).can_write(current_user)
    record.errors.add attr, 'cannot be found.'
  end
end

超汎用の validates_each に必要な 3 行の代わりに、Rails 3.0 にはこれを指定するためのより良い方法があることもわかりました。

http://ryandaigle.com/articles/2009/8/11/what-s-new-in-edge-rails-independent-model-validators

于 2010-01-29T19:43:25.377 に答える