Rails:“except”vs“slice”取出某些参数?

时间:2017-12-06 14:42:24

标签: ruby-on-rails ruby

我正在尝试创建一个类实例,其中一个特定的键被提取出来并保存以供日后使用

考虑这是param的类型:

Parameters: {"p1": "foo", "p2": "bar", "p3":"param that i want to extract" >

我会做类似的事情:

@my_class = MyClass.new(whiteList_function.except(:p3))

或类似

@my_class = MyClass.new(whiteList_function)
@my_class_key = @my_class.slice(:p3)

我的whiteList_function:

def whiteList_function
    params.require(:my_class).permit(:p1,:p2,p3)
end

我担心的是,我搜索了SO,有些人提到了使用except的安全风险。

所以我的问题是,在这个特定用法中(取出某些密钥并在以后使用它们),我应该使用except还是slice

2 个答案:

答案 0 :(得分:2)

except与参数哈希一起使用是危险的,因为您说“允许除此之外的任何参数”,因此它会将模型打开以进行质量分配攻击。

除非我没有考虑其他攻击媒介,否则您应该没问题,因为您在whiteList_function中使用strong_parameters过滤了可接受的参数哈希值。所以,您可以使用sliceexcept进一步过滤该哈希值,无论哪个更吸引您。

答案 1 :(得分:0)

我没有Rails用户,也许我误解了你的问题但是在Ruby中这就是我要做的事情

class MyClass
  attr_reader :params
  def initialize params
    @params = whiteList_function params
  end
  def whiteList_function params
    whiteList = [:p1, :p2]
    params.select{|key| whiteList.include? key }
  end
end

MyClass.new({"p1": "foo", "p2": "bar", "p3":"param that i want to extract"})
# #<MyClass:0x00000002802a58 @params={:p1=>"foo", :p2=>"bar"}>