我有一个评论模型。我通过将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]并评论另一个问题?有没有更好的方法呢?
答案 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,但是你看看用户是否有权这样做: - )