我在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的值吗?
答案 0 :(得分:1)
是的,DokiCore.const_get('::User')
之类的内容即使有User
,也会返回最高DokiCore::User
课程。
只需针对您的用户参数添加一些白名单检查,您就可以了:
raise 'Invalid class!' unless ['GoodClass'].include? complete_params[:pointer_type]