2016-10-03 3 views
0

PostとPostCommentという2つのモデルがあります。Railsはhidden_​​fieldタグを使用せずにリクエストに余分なパラメータを渡します。

<%= f.hidden_field :posttime, value: Time.now.getutc %> 
<%= f.hidden_field :post_id, value: @post.id %> 
<%= f.hidden_field :user_id, value: current_user.id %> 

それは私には遅クリック: は現時点では、私は、ポストの時間のようなコメントはこのように作られてされているコメントのポスターやポストIDのユーザーIDを余分にデータを送信するためにhidden_fieldフォームヘルパーを使います私はブラウザの検査官を使用してこれらの値を変更することができ、それはセキュリティ違反です。どうすればこれらのパラメータを安全に送信できますか?

答えて

1

通常、これらの値は、フォームから渡されていませんが、ネストされたURLを使ってURLを介してアクセスされている(どのようにここで読む:http://guides.rubyonrails.org/routing.html)を

例えばpost_idフォームにURLを使用する、あなたのコメントを設定したいですあなたがnew_post_comment_pathを持っていて、あなたのコントローラにparams[:post_id]にアクセスすることができます。

あなたのフォームはこのようなものになるだろう:

<% form_for [@post, Comment.new] do |f| %> 
    ... 
user_idは - 間違い形で、あなたは、これは大きなセキュリティ上の懸念事項であることは非常に正しいことを通過しない(人がコメントを追加することができます他の人のために!)コントローラの認証方法(例: current_user)でアクセスしてください。あなたのコントローラなどで、このようなものに終わるだろう

:あなたは本当に渡す必要はありませんので、

def create 
    @post = Post.find(params[:post_id]) 
    @comment = @post.comments.new(comment_params) 
    @comment.user = current_user 
    if @comment.save 
    redirect_to [@post, @comment] 
    else 
    render_action :new 
    end 
end 

private 

# Don't forget to use require/permit to make sure the user can't 
# fake up the user/post id fields themselves out of whole-cloth 
def comment_params 
    # or whatever your permitted comment-fields are. 
    params.require(:comment).permit(:content) 
end 
+0

おかげでそれを保存することができ私のためのもの。私は 'post_id'パラメータが自動的に渡されたことを知らなかったので、もっと意味があります。私はdeviseを使用しているので、 '@post_comment.user_id = current_user.id'(コード行が間違っていることや、少なくとも規約に従わないことを暗示する)であるべきではありません –

+0

' belongs_to:user '' Comment'モデルでは、 'user'または' user_id'を使うことができます。どちらもちゃんと働くでしょう:) どちらか一方のバリデーションがある場合は、例えば ​​'validates_presence_of:user_id'はあなたが' @comment.user_id = current_user.id'を好むべきであることを意味します) –

+0

素晴らしい!コントローラー自体のユーザーIDを登録しているので、ユーザーがサインインしている場合にのみフォームがユーザーに表示されるようにしていますので、 'validates_presence_of:user_id'権限は必要ありません。 –

1

Time.now.getutccurrent_user.idcreateupdate方法であなたのアプリケーションで既に利用されていますそれらの背中。 @post.id用として、あなたはちょうど...あなたのnewedit方法でセッション変数に

session[post_id] = @post.id 

してからcreateか `updateメソッドで...多くをクリアするための

@post_comment.post_id = session[:post_id] 
+0

'Time.now.utc'がコントローラ自体の内部で使用できることは私にはまったくありませんでした。それを見つけてくれてありがとう。 –

関連する問題