2011-11-24 32 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,這對於能力來說非常簡單。 –