[英]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
,使他只能确认属于他的订单。
强参数 :防止意外暴露不应暴露的物体。 它们通常在您创建或更新模型时使用,这样可以避免输入参数未被允许。
我有一些建议:
operacion
到operation
ConfirmpaymentController
到类ConfirmPaymentController
你可以看到: Ruby on Rails 4的最佳实践和样式处方 :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.