Ruby on rails 强参数,可在Rails 4中找到
我的自定义控制器中的强参数有问题。我了解如何在新操作或更新操作中使用强参数。然而,我似乎无法确定这是否是在我的自定义操作中不安全地使用params[]散列 我的视图重定向到具有订单id和操作编号的控制器: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
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])
更新到数据库中。我永远不会觉得这样做很舒服,即使可能是这样。我更喜欢像示例中那样直接分配参数。