2011-02-01 2 views
1

私は、ユーザーがエントリに投票できるようにするためにこれを使用する:これは質量割り当てに脆弱ですか?

<% form_tag url_for(entry_votes_path(@entry)), :id => 'voting_form', :remote => true do %> 
     <%= hidden_field_tag 'vote[user_id]', current_user.id %> 
     <%= submit_tag 'Vote for this entry', :id => 'voting_button' %> 
<% end %> 

これは私のコントローラのコードです:

def create 
    @entry = Entry.find(params[:entry_id]) 
    @vote = @entry.votes.build(params[:vote]) 

    respond_to do |format| 
    if @vote.save 
     format.html { redirect_to @entry } 
     format.js 
     end 
    end 
    end 

私は2つの質問

私は current_user.idを割り当てることができますどのように
  1. を持っています隠しフィールドを使わずに?

  2. また、私は今投票モデルでattr_accessibleまたはattr_protectedを使用していません。誰かがたくさんの票を作ることができないように、モデルを保護するにはどうしたらよいですか?現在、投票モデルのすべてのフィールドは、paramsハッシュによって設定されています。attr_protected、つまりentry_idという外部キーを使用し、それをコントローラーで個別に設定する必要がありますか?

+0

投票を作成するときにcurrent_userをparamsにマージしてみませんか?この時点でユーザーのセッションは無効ですか? –

+0

いいえ、私はエントリーインスタンスで投票を構築しているので、構文がわかりません。 – Slick23

答えて

2

私は投票モデルにattr_accessible またはattr_protectedを使用していないよ 今...

次に、定義により、質量割り当ては、クエリ文字列から可能です。

私は たentry_id外部キー、たとえば上attr_protected使用し、それがコントローラで別々に を設定すべきか?

一般に、attr_accessibleはattr_protectedよりも使用する方が良いです。これは、attr_accessibleが質量割り当てに対してデフォルトのdeny-allを設定し、ホワイトリストに登録された例外を定義できるようにするためです。一方、attr_protectedは特定の属性をブラックリストに登録するよう強制します。プログラムを変更してattr_accessible setを指定して新しい属性を追加すると、属性をホワイトリストに登録して忘れる必要がある場合、プログラムは失敗します。つまり、安全に失敗します。あるいは、attr_protected setを指定して新しい属性を追加すると、新しい属性がブラックリストに含まれていても、プログラムはで動作します。言い換えれば、それは不安定に失敗する。

ここでのルールは、クエリ文字列から設定できるようにするのは危険な属性を保護することです。キーを保護すると、新しい行の挿入を防止できますが、の内容を変更することを防ぐには、他のフィールドを保護する必要があります。行。

これに関する良い参考資料はguides.rubyonrails.orgです。

+0

したがって、 'attr_accessible'を安全なオプション(「entry_id」を除くすべてのもの)に追加すれば、コントローラー内でparamsハッシュの外側で「entry_id」をどのように設定して保存すればよいですか? – Slick23

+0

上記のリンクされたガイドの第6.1節では、明示的に設定される属性を示しています。ユーザーがハッシュから属性を直接設定することを禁止しているため、ハッシュ値を確認して検証し、 –

関連する問題