Rails 5.2:保护form_for以防止用户更改表单的select_tag / hidden_​​field值

时间:2019-06-13 05:05:18

标签: ruby-on-rails ruby forms ruby-on-rails-5.2

在我的表单中,我使用的是authenticity_token: true,我想知道这是否足以阻止current_user更改我的select_tag的给定选项?同样的问题也适用于在我的表单中使用hidden_field

就我而言,有一种表单,current_user可以在其中创建用户并将其添加到公司。 current_user可以选择自己的公司,例如current_user.companies.order(:name),但是我担心current_user会破坏我的表格并传递不属于他的Company ID。基本上,current_user可以成为外国公司的用户,然后做令人讨厌的事情...

到目前为止,我一直在阅读https://guides.rubyonrails.org/security.html,也许还没有注意到那里的一些重要信息。我很高兴知道更多我可以采取的任何安全措施,以使我的表格更安全。谢谢。

1 个答案:

答案 0 :(得分:3)

通常,当您要在关联之前验证记录时会出现这种问题。

经典的解决方案是在提交表单后在服务器端对其进行验证。

例如,如果您只想与用户创建一个关联的对象,而您将user_id传递为hidden_field。最好直接针对当前用户创建对象,从而避免对隐藏字段进行任何操作。

代替

Article.create(article_params) # which includes user_id provided as hidden field

current_user.articles.create(article_params) # no need of user_id

因此,在创建新用户之前,您可以检查类似的情况

user = User.new(params) # remove company_id from here
user.company = current_user.companies.find_by(id: params[:user_params][:company_id]) # This will set company to `nil` if the company is not associated with current user
user.save