可以由用户修改params.require.permit不属于params字段吗?

时间:2014-05-17 07:32:21

标签: ruby-on-rails ruby security validation permissions

如果我有嵌套资源,例如

resources :club do
    resources :agenda
end

他们的关系如下:

 club has_many agendas  
 agenda belongs_to club

如果我的议程的创建操作接受params[:club_id]并将其分配给议程的俱乐部参考,是否可以安全地假设用户无法修改该字段(club_id不属于我的params.require.permit)?

我的意思是,在使用params[:club_id]创建议程之前,我是否还需要检查club_id是否属于当前用户,还是我相信params[:club_id]无法被篡改用户。

我担心用户只需修改params的哈希就可以从其他俱乐部创建议程。

fyi,我正在使用的一些相关宝石是设计和cancan。

1 个答案:

答案 0 :(得分:0)

首先,你需要阅读authorization(关于它的伟大Railscast


<强>系统

然后您需要确保正确设置系统

如果users无法修改特定资源,则需要授权才能编辑/提交这些资源。为此,您可以使用cancan gem来确定用户是否可以在控制器级别编辑/创建资源:

  #app/controllers/agendas_controller.rb
  load_and_authorize_resource

这首先确保您能够确定current_user是否实际上能够将club更改为


<强> PARAMS

要做的第二件事是确保正确处理params

strong params基本上允许您将特定的参数发送到您的模型,其中包括club_id

您遇到的问题是,在提交表单后,您不希望有人注入不同的参数。为防止这种情况发生,您应仅在控制器中指定club_id - 这将确保前端无法设置值:

params.require(:adgenda).permit(:your,:params).merge(club_id:params [:club_id])

通过设置控制器中的值,这意味着只有服务器可以访问该值,允许您相应地提交

这与前端授权相结合,应为您的应用提供基本的安全级别