通过传递params安全创建新模型?

时间:2011-11-24 06:09:30

标签: ruby-on-rails

我有一个评论模型。我通过将params从我的视图传递给注释控制器来创建该模型的新实例。这是评论控制器:

class CommentsController < ApplicationController
  def create
    session[:return_to] = request.referrer
    @comment = Comment.create(:user_id  => current_user.id,
                             :issue_id => params[:issue_id],
                             :content  => params[:content])
    redirect_to session[:return_to]
  end
end

以下是我在视图中传递参数的方法:

<%= link_to "Test Comment", comments_path(:issue_id => @issue.id,
                                          :content  => "HeLLO"),
                            method: :create %>

我的问题是 - 这是安全的吗?什么阻止某人改变params [:issue_id]并评论另一个问题?有没有更好的方法呢?

1 个答案:

答案 0 :(得分:1)

是的,有更好的方法

首先我们看看你的控制器。存储引用者并重定向回到它是没有意义的(至少你不应该在会话中保存它)rails可以使用键来做到这一点:返回。

在第二个你不需要对@进行变换,因为你不使用创建的对象。而且你也不需要保存restult。只是做

class CommentsController < ApplicationController
  def create
    Comment.create(:user=>current_user, :issue_id=>params[:issue_id],:content=> params[:content])
    redirect_to :back
  end
end

++编辑

实际上更好的方法就是这样:

class CommentsController < ApplicationController
  def create
    current_user.comments.create(issue_id: params[:issue_id], content: params[:content])
    redirect_to :back
  end
end

只使用rails association

- 编辑

并且您认为,是的,我们可以更改issue_id并将评论写入我想要的任何问题。因此,如果你想要保护这一点,你就可以在你发表评论之前做一个帮助(这只是一个例子)

class CommentsController < ApplicationController
  def create
    issue = Issue.find(params[:issue_id]
    if issue.is_locked? || current_user.cant_write_at_issue(issue)
      return redirect_to :back, :notice=>"You dont have Privilegs"
    end
    issue.comments.create :user=>current_user, :content=>params[:content])
    redirect_to :back :notice=>"Comment was created successfully"
  end
end
您需要在模型中定义

is_locked和cant_write_at_issue。这只是一种如何保护某事的方法。

所以现在我们可以更改问题ID,但是你看看用户是否有权这样做: - )