ruby-on-rails - Rails 4 中的强参数和查找

标签 ruby-on-rails ruby-on-rails-4 activerecord strong-parameters

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

我的 View 重定向到带有订单 ID 和操作编号的 Controller :

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

我的确认支付 Controller 如下:

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 键。您的应用程序会接受它。 强参数检查散列并防止更改。

在您上面的示例中,强参数没有带来任何优势。您将值直接分配给适当的表列。无法为用户修改数据库中的任何其他属性。如果您的 Controller 中没有任何其他方法,您可以删除整个 #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

我还没有测试代码,但它应该可以工作。

这是 Docs of Strong Parameters .他们更详细地描述了一切。

希望对您有所帮助!

快乐编码:)

关于ruby-on-rails - Rails 4 中的强参数和查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33812824/

相关文章:

ruby-on-rails - 在 Rails 4 中的 rake 任务/后台作业/模型中呈现部分/ View

mysql - 用户实体/表 - 对这种关系建模

ruby-on-rails - 显示您关注的用户的帖子?

sql - 使用别名比较 Rails ActiveRecord 中的两个字段

ruby-on-rails - 已加载模型的预加载关联

ruby-on-rails - Rails 中 "unknown OID"错误的来源是什么?

ruby-on-rails - rails 链接到另一个 Controller

ruby-on-rails - rake 数据库 :schema:load works in development but not production

mysql - 如何控制 Rails 4 中连接记录的顺序

ruby - 设计和current_page?