Ruby on rails 强参数,可在Rails 4中找到

Ruby on rails 强参数,可在Rails 4中找到,ruby-on-rails,ruby-on-rails-4,activerecord,strong-parameters,Ruby On Rails,Ruby On Rails 4,Activerecord,Strong Parameters,我的自定义控制器中的强参数有问题。我了解如何在新操作或更新操作中使用强参数。然而,我似乎无法确定这是否是在我的自定义操作中不安全地使用params[]散列 我的视图重定向到具有订单id和操作编号的控制器: link_to 'Confirm', confirmpayment_confirm_path(order: order, operacion: order.operacion), :data => { confirm: 'Are you sure?' } 我的confirmpaymen

我的自定义控制器中的强参数有问题。我了解如何在新操作或更新操作中使用强参数。然而,我似乎无法确定这是否是在我的自定义操作中不安全地使用params[]散列

我的视图重定向到具有订单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  
class ConfirmpaymentController“待定”)
结束
def确认
授权!:确认,确认付款
@order=order.find(参数[:order])
@order.payment_id=参数[:操作]
@order.confirm\u payment\u date=DateTime.now()
@订单.保存
结束
def order_参数
参数require(:order).permit(:order,:operation)
结束
结束
问题是:


我在确认操作中没有使用
order\u params
,因为这不是新订单。我正在使用参数查找正确的顺序并确认它。这安全吗?还是我遗漏了什么?

strong参数:防止意外暴露不应暴露的内容。它们通常在创建或更新模型时使用,这是为了避免输入不允许的参数

我有一些建议:

  • 最好用英语编码:
    操作
    操作
  • 检查样式 在您的代码
    ConfirmpaymentController
    ConfirmPaymentController

  • 您可以看到::)

    关于参数的使用方法,我认为它没有什么问题。但是关于安全问题,您可能需要考虑这样一种情况,即用户只需将
    Order
    参数更改为不属于他的内容,就可以更改任何
    Order
    信息


    在这种情况下,您需要将查询限制为
    订单
    ,使他只能确认属于他的订单。

    因此需要澄清一些事情

    强参数负责传递到数据库的允许参数。它应该防止用户修改数据库中不允许修改的属性

    例如:

    下表中有列:

    User:
     - firstname
     - lastname
     - email
     - password_digest
     - role (user, admin)
    
    您可能希望阻止普通用户更改其
    角色
    。但是,如果您将参数散列原样传递给数据库,他还可以向散列中添加一个带有值的
    角色
    键。你的申请会接受的strong参数检查哈希并防止更改

    在上面的示例中,强参数不会带来任何好处。您可以将这些值直接指定给相应的表列。无法为用户修改数据库中的任何其他属性。如果控制器中没有任何其他方法,则可以删除整个
    #order_参数
    。如果试图直接传递散列,强参数只会引发异常

    但是,我建议您在分配之前在数据库中搜索付款。如果您直接分配
    付款\u 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
    
    class PaymentConfirmationController“待定”)
    结束
    def确认
    @order=order.find(参数[:order\u id])
    @payment=payment.find(参数[:操作\u id])
    #如果找不到订单或付款,您应该捕获异常
    @order.payment=@payment
    @order.payment\u confirmation\u date=Time.now()
    @订单.保存
    结束
    私有的
    def授权用户!
    授权!:确认,确认付款
    结束
    结束
    
    我还没有测试代码,但它应该可以工作

    这是你的电话号码。他们更详细地描述了一切

    我希望这有帮助


    快乐编码:)

    是的,当然。我正在通过cancan授权这一行:
    authorize!:确认,:confirmpayment
    只有订单的所有者或管理员才能确认。感谢您对样式的建议。但是问题仍然存在:如何在自定义控制器中使用强参数?我只看到了新的或更新的动作的例子。你的问题是“这是安全的吗?”,这就是我的答案。“奥古斯托基本上和你所需要的动作是一样的,只需要考虑你想允许的参数。我的回答解释了它的用途。这是为了避免输入参数而不允许的。
    payment\u id
    只是外部提供者的id,还是指向数据库中记录的外键。到
    付款
    表格?正是这样。一个指向数据库中记录的外键。终于找到了!因此,在执行类似于
    @order.的操作时,有强大的参数可以防止大规模攻击。直接将_属性(params[:order])
    更新到数据库中。我永远不会觉得这样做很舒服,即使可能是这样。我更喜欢像示例中那样直接分配参数。