2011-11-24 31 views
1

我有一个评论模型。我正在通过将参数从我的视图传递给注释控制器来创建该模型的新实例。以下是评论控制器:通过传递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 

这里是我想过去的PARAMS在我看来:

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

我的问题是 - 这是安全的?什么阻止某人更改params [:issue_id]并评论其他问题?有没有更好的方法来做到这一点?

+0

请问你的模型'Comments'在[验证]执行任何授权检查(HTTP访问://指南.rubyonrails.org/active_record_validations_callbacks.html)?您的模型可以扩展到授权吗? – sarnold

+0

不,它没有。我想不出任何验证添加,以防止用户试图更改参数 –

回答

1

是的,有更好的方法

首先,我们期待你的控制器。存储引用和重定向回它没有任何意义(至少你不应该保存在一个会话中)rails可以用key:back来做到这一点。

在第二,你不需要用@来形容变化,因为你不使用创建的对象。而且你也不需要保存修复。只是做

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 

只是用钢轨协会

- 编辑

,正如您所想的那样,是的,我们可以更改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但你看看用户是否有这样做的:-)

+0

这些是伟大的建议,谢谢。我唯一的问题是什么is_locked?和cant_write_at_issue看起来像什么?所有用户都有能力写入所有问题,所以我不确定何时会锁定问题或者用户无法写入问题。 –

+0

如果所有用户都有写入所有问题的能力,那么问题是什么?你的OP说“如何阻止他们评论另一个问题?” - 但你刚刚说过,这就是应用程序功能......?: -/ – Pavling

+0

当他们评论所有问题时,那么你不应该担心,如果有人可以更改ID :) class问题 def is_locked? 锁定 结束 结束 在问题(布尔类型)中产生一个字段,命名为locked。默认为0.那么你可以将它设置为1(真),问题被锁定,没有人可以对它进行评论。你也可以看看can_can gem,这对于能力来说非常简单。 –