限制通过浏览器提交的参数是不好的做法?

时间:2011-04-09 19:59:24

标签: ruby-on-rails ruby

我有一个单表继承设置,我有一个控制器(我觉得有多个会重复)。但是,对于某些方法,我想调用模型的子类。我想我可以让浏览器发送一个参数,我会写一个case语句。类似的东西:

case @model[:type]
when "A"
  @results = Subclass1.search(params[:term])
when "B"
  @results = Subclass2.search(params[:term])
...
end

或者,我了解到Ruby,在所有它的诡计中可以用字符串创建一个模型。类似的东西:

@results = params[:model].constantize.search(params[:term])

我的问题:这是一种不好的做法吗?我可以想象有人鬼鬼祟祟可以制作一个请求,让我形成一个任意的内部对象..但我可以确认该对象是我想要的东西的子类..

3 个答案:

答案 0 :(得分:7)

这样做时,我喜欢用case重构它,只是为了清楚我允许的输入:

@results = case params[:model]
  when 'page'   then Page
  when 'post'   then Post
  else raise 'finger'
end.search(params[:term])

答案 1 :(得分:1)

如果你有一个白名单的对象,你在它之前检查它,那么你应该没问题。你总是希望确保你正在使用来自外部资源的输入并进行验证,以保护自己。

答案 2 :(得分:1)

这个片段使用了Ick的maybe来简化,但是在你觉得舒服的时候写它,关键是使用哈希:

@results = {"A" => Subclass1, "B" => Subclass2}[params[:model]].maybe.search(params[:term])