3

我在我的自定義控制器中遇到了強烈的參數問題。我瞭解如何在新的或更新操作中使用強參數。但是,我似乎無法弄清楚,如果這是不安全的使用params []哈希或不在我的自定義操作。強大的參數和在軌道中查找4

我的視圖重定向到與訂單ID和操作數的控制器:

link_to 'Confirm', confirmpayment_confirm_path(order: order, operacion: order.operacion), :data => { confirm: 'Are you sure?' } 

我confirmpayment控制器如下:

class ConfirmpaymentController < ApplicationController 
    before_action :authenticate_user! 

    def lookup 
    authorize! :lookup, :confirmpayment 
    @orders=Order.where(:status => 'PENDING') 
    end 

    def confirm 
    authorize! :confirm, :confirmpayment 
    @order=Order.find(params[:order]) 
    @order.payment_id = params[:operacion] 
    @order.confirm_payment_date = DateTime.now() 
    @order.save 
    end 

    def order_params 
    params.require(:order).permit(:order, :operacion) 
    end 

end 

的問題是:

我由於這不是新訂單,因此在我的確認操作中不使用order_params。我正在使用該參數來查找正確的順序並進行確認。這是安全的嗎?或者我錯過了什麼?

+0

'payment_id'只是外部提供者的ID,還是指向數據庫中記錄的外鍵。例如。到「付款」表? – Tobias

+0

就是這樣。指向數據庫中的記錄的foreign_key。 – Augusto

回答

1

所以清除一些東西了。

強參數負責傳遞給您的數據庫的允許參數。它應該防止用戶修改數據庫中不允許修改的屬性。

例如:

您有列如下表:

User: 
- firstname 
- lastname 
- email 
- password_digest 
- role (user, admin) 

你可能想阻止正常用戶更改他們的role。但是,如果將參數散列傳遞給數據庫,那麼他還可以爲該散列添加一個值爲role的鍵。你的應用程序會接受它。 強參數檢查散列並阻止更改。

在上例中,強參數沒有優勢。將值直接分配給適當的表格列。無法爲用戶修改數據庫中的任何其他屬性。如果您的控制器中沒有其他方法,則可以刪除整個#order_params。如果您嘗試直接傳遞散列,則Strong參數會引發異常。

但是,我建議您在分配數據庫之前先搜索數據庫中的付款。如果您直接分配payment_id,則不能保證存在付款。所以首先檢查付款,如果你發現它分配給訂單。

這裏是我會做:

class PaymentConfirmationController < ApplicationController 
    before_action :authenticate_user! 
    before_action :authorize_user! # To DRY up your code 

    def lookup 
    @orders = Order.where(:status => 'PENDING') 
    end 

    def confirm 
    @order = Order.find(params[:order_id]) 
    @payment = Payment.find(params[:operation_id]) 
    # You should catch the exceptions if an order or payment wasn't found 

    @order.payment = @payment 
    @order.payment_confirmation_date = Time.now() 
    @order.save 
    end 

    private 

    def authorize_user! 
    authorize! :confirm, :confirmpayment 
    end 
end 

我沒有測試的代碼,但它應該工作。

以下是Docs of Strong Parameters。他們更詳細地描述了一切。

我希望這有助於!

快樂編碼:)

+0

終於明白了!所以有強有力的參數可以在直接執行像'@ order.update_attributes(params [:order])'這樣的''操作時防止批量分配。儘管可能是Rails的方式,但我永遠不會感到舒服。我更喜歡直接像例子中那樣分配參數。 – Augusto

0

強參數:防止意外暴露不應暴露的部分。它們通常用於創建或更新模型時,這可以避免輸入參數不被允許。

我有一些建議:

  1. 英語最好編碼:operacionoperation
  2. 檢查風格 在你的代碼ConfirmpaymentControllerConfirmPaymentController

你可以看到:best practices and style prescriptions for Ruby on Rails 4 :)

+0

感謝您對造型的建議。但問題依然存在:我如何在自定義控制器中使用強參數?我只看到新的或更新操作的例子。 – Augusto

+0

你的問題是「這是安全嗎?」,這是我的答案。 – kalelc

+0

@Augusto基本上它是你需要的行爲相同的行爲,只需要考慮你想要允許的參數。我的答案解釋了使用。 _這是爲了避免輸入參數沒有被允許._ – kalelc

0

關於使用參數的方式,我認爲它沒有問題。但是關於安全問題,您可能需要考慮用戶可以通過將order參數更改爲不屬於他的內容來更改任何Order信息的情況。

在這種情況下,您需要將查詢限制爲Order,使他只能確認屬於他的訂單。

+0

是的。我通過cancan在這一行授權:'授權! :確認,:confirmpayment'只有訂單的所有者或管理員才能確認。 – Augusto