在我的表单中,我使用的是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,也许还没有注意到那里的一些重要信息。我很高兴知道更多我可以采取的任何安全措施,以使我的表格更安全。谢谢。
答案 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