消毒输入

时间:2012-06-15 00:16:29

标签: ruby-on-rails params sanitize

这可能是一个真正的n00b问题,但是如果你的params列表包含一堆不属于可访问属性的东西,即

params = {"controller"=>"api1/users", "action"=>"create"}

什么是“消毒”你的参数的最佳方法,以便它们只包含可访问的属性。我当前想到的当前方式是:

User._accessible_attributes[:default].entries

给我一​​个可访问属性列表,然后只传递这些参数:

["", "email", "password", "fb_token", "fb_id", "fb_name", "first_name", "last_name", "gender"

另一种可能的方法是:

  def clean_params #ANTIPATTERN
    params.delete(:controller)
    params.delete(:action)
  end

但这也像反模式......

我知道你应该做一些像params [:user]这样的东西来获取只有可访问的params,但是因为这是一个API,所以能够在url中传递内容会很好。

谢谢!

2 个答案:

答案 0 :(得分:2)

你可以这样做......这只会在控制器中你想要的参数中感知到。信用:dhh's gist

class UserController < ApplicationController
  respond_to :html

  def create
    respond_with User.create(user_params)
  end

  private
  def user_params
    params[:user].slice(:email, :first_name, :last_name)
  end

end

答案 1 :(得分:2)

Rails参数包装器会自动为您执行此操作。也就是说,它会接受顶级参数并将它们分组,例如:user以方便您使用,过滤掉用户模型无法访问的任何参数。在内部它使用accessible_attributes,类似于你所做的。使用您的API的人不需要对属性进行分组 - rails会在将params交给您的控制器操作之前执行此操作。

默认情况下,它已针对JSON请求启用,但您可以通过编辑initializers/wrap_parameters.rb来扩展它。或者,您可以使用控制器中的wrap_parameters method在每个控制器的基础上调整行为。

参数消毒的轨道方案可能会在4.0中发生变化,趋向于远离模型并朝向控制器。您可能希望观看strong_parameters gem的开发,​​这可能是对未来事物的预览。