3

フォームがどのように機能するかについてはよくわかりません。

シナリオ例

ユーザーはアンケートを作成できますが、作成後に編集することはできず、質問を追加するだけであるとします。これは、調査の編集アクションを使用して実行されます。

class Survey < ActiveRecord::Base
  has_many :questions
  accepts_nested_attributes_for :questions
end

class Question < ActiveRecord::Base
  belongs_to :survey
  belongs_to :user
end

# QuestionsController

def edit
  @survey = Survey.find(params[:id])
  @survey.questions.build
end

def update
  @survey = Survey.find(params[:id])
  @survey.update_attributes(params[:survey])
  redirect_to ...
end

その場合、フォームは次のようになります。

<%= form_for @survey do |f| %>
  # No surveys fields on this form!

  <% f.fields_for :questions do |builder| %>
    <%= render "question_fields", :f => builder %>
  <% end %>

  <%= f.submit "Submit" %>
<% end %>

これにより、作成後に調査のフィールドを使用できなくしたい場合でも、調査の値が脆弱になったり、ハッキングされたりする可能性がありますか?

一般的にはどうですか?フォームにない場合でもモデル値を編集できますか?これの背後にある論理は何ですか、そしてどうやって彼らができなかったことを知ることができますか?

ありがとう、ただ学ぼうとしている初心者。

4

3 に答える 3

2

はい。これらの属性は、フィールドを指定しなくても、フォームにパラメーターとして送信することで編集できます。

これを防ぐために、属性を明示的に保護できます(Railsの新しいバージョンでは、これがデフォルトです)。Surveyモデルに追加します

attr_protected :name # or whatever other attributes that model has

これにより、作成と更新の両方で、これらの属性の一括割り当てが防止されます。作成を許可するには、 :のcreateアクションでこれらの属性を明示的に割り当てる必要があります。SurveyController

def create
  @survey = Survey.new # instead of Survey.new(params[:survey])
  @survey.name = params[:survey][:name]
  @survey.save 
  # etc
end

編集:

blackbird07が指摘しているように、ここで説明するブラックリストアプローチではなく、一括割り当てを許可する属性をホワイトリストに登録することをお勧めします。

于 2012-06-26T11:18:31.057 に答える
1

つまり、はい。curlなどのツールを使用するか、ブラウザ開発ツールを使用してHTMLフォームを編集することにより、巧妙に作成されたPOSTリクエストで編集できます。その理由はupdate_attributes、paramsパラメーターで指定されたすべての属性を更新する更新を行うために使用するためです。これは一括割当と呼ばれます。

編集可能にしたい属性をホワイトリストに登録することをお勧めします:http://guides.rubyonrails.org/security.html#mass-assignment

また、 「強力なパラメーター:モデルではなくコントローラーでの質量割り当ての処理」に関するこの記事を読むことを強くお勧めします。

于 2012-06-26T11:19:37.027 に答える
1

置くことで大量割り当てから保護することもできます

config.active_record.whitelist_attributes = true

config/application.rbにあります

ここで、すべての属性に明示的にアクセス可能のラベルを付ける必要があります。これは、アプリ内のすべてのモデルの属性の空のホワイトリストを作成することによって行われます。

于 2012-06-27T04:32:59.070 に答える