繁体   English   中英

强参数和在Rails中查找4

[英]Strong Parameters and Find in Rails 4

我在自定义控制器中遇到强参数问题。 我了解如何在新操作或更新操作中使用强参数。 但是,在我的自定义操作中,我似乎无法弄清楚这是否是对params []哈希的不安全使用。

我的视图重定向到具有订单ID和操作号的控制器:

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

我的确认支付控制器如下:

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 ,因为这不是新订单。 我正在使用参数来查找正确的顺序并确认它。 这样安全吗? 或者我错过了什么?

所以要清除一些事情。

Strong Parameters负责传递给数据库的允许参数。 它应该阻止用户修改数据库中不允许修改的属性。

例如:

您有以下表格列:

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

您可能希望阻止普通用户更改其role 但是,如果将参数哈希原样传递给数据库,他还可以向哈希添加一个带有值的role键。 您的申请会接受它。 强参数检查哈希并防止更改。

在上面的示例中,强参数没有任何优势。 您可以将值直接分配给相应的表列。 无法为用户修改数据库中的任何其他属性。 如果控制器中没有任何其他方法,则可以删除整个#order_params 如果您尝试直接传递哈希,则强参数只会引发异常。

但是,我建议您在分配之前在数据库中搜索付款。 如果您直接指定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

我没有测试过代码,但应该可以使用。

这是强参数文档 他们更详细地描述了一切。

我希望这有帮助!

快乐编码:)

关于使用参数的方式,我认为它没有任何问题。 但是关于安全问题,您可能想要考虑用户可以通过将order参数更改为不属于他的内容来更改任何Order信息的情况。

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

强参数 :防止意外暴露不应暴露的物体。 它们通常在您创建或更新模型时使用,这样可以避免输入参数未被允许。

我有一些建议:

  1. 英国优选地编码: operacionoperation
  2. 检查代码ConfirmpaymentController到类ConfirmPaymentController

你可以看到: Ruby on Rails 4的最佳实践和样式处方 :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM