使用const_get清理/完整性检查用户提供的内容

时间:2015-09-26 22:27:37

标签: ruby-on-rails ruby

我在Rails应用程序中有一个操作,我在其中使用“类型”进行多态关联并查找一个类(DokiCore是我的引擎的名称):

def complete
  model_class = DokiCore.const_get(complete_params[:pointer_type])
  pointer = model_class.find(complete_params[:pointer_id])
end

def complete_params
  params.require(:progress).permit(
    :pointer_id,
    :pointer_type
  )
end

我担心用户可以提供带有“pointer_type”的随机类,并尝试在引擎名称空间中查找其他类。这有点担心吗?是否有Rails-y类型的方式按名称查找模型 或者我应该添加一个方法来测试我想在多态关联中允许的所有模型的pointer_type的值吗?

1 个答案:

答案 0 :(得分:1)

是的,DokiCore.const_get('::User')之类的内容即使有User,也会返回最高DokiCore::User课程。

只需针对您的用户参数添加一些白名单检查,您就可以了:

raise 'Invalid class!' unless ['GoodClass'].include? complete_params[:pointer_type]