3

我不熟悉表单的工作方式。

示例场景

假设用户可以创建调查,但创建后无法编辑它们,只能向它们添加问题。这是通过使用调查上的编辑操作来完成的。

class Survey < ActiveRecord::Base
  has_many :questions
  accepts_nested_attributes_for :questions
end

class Question < ActiveRecord::Base
  belongs_to :survey
  belongs_to :user
end

# QuestionsController

def edit
  @survey = Survey.find(params[:id])
  @survey.questions.build
end

def update
  @survey = Survey.find(params[:id])
  @survey.update_attributes(params[:survey])
  redirect_to ...
end

那么表格应该是:

<%= form_for @survey do |f| %>
  # No surveys fields on this form!

  <% f.fields_for :questions do |builder| %>
    <%= render "question_fields", :f => builder %>
  <% end %>

  <%= f.submit "Submit" %>
<% end %>

现在,即使我希望调查的字段在创建后无法使用,这是否会使调查的值易受攻击或容易被黑客入侵?

一般来说呢?模型值不在表单上时是否仍可编辑?这背后的逻辑是什么,我怎么知道他们不能?

谢谢,刚入门的新手。

4

3 回答 3

2

是的,这些属性仍然可以通过将它们作为参数提交到表单来进行编辑,即使您没有为它们提供字段。

为了防止这种情况,您可以显式地保护属性(在以后的 Rails 版本中,这是默认设置)。在您的Survey模型中,添加

attr_protected :name # or whatever other attributes that model has

这可以防止对这些属性进行批量分配,无论是创建还是更新。要允许创建,您必须在create您的操作中明确分配这些属性SurveyController

def create
  @survey = Survey.new # instead of Survey.new(params[:survey])
  @survey.name = params[:survey][:name]
  @survey.save 
  # etc
end

编辑:

正如 blackbird07 指出的那样,更好的方法是将您希望允许对其进行批量分配的那些属性列入白名单,而不是此处描述的黑名单方法。

于 2012-06-26T11:18:31.057 回答
1

简而言之:是的,可以使用 curl 之类的工具或通过使用浏览器开发人员工具编辑 HTML 表单,通过精心设计的 POST 请求来编辑它们。原因是您update_attributes用于进行更新,这将更新 params 参数中提供的所有属性。这称为批量分配。

建议您将要编辑的属性列入白名单:http: //guides.rubyonrails.org/security.html#mass-assignment

此外,强烈建议您阅读这篇关于“强参数:在控制器而不是模型中处理质量分配”的文章

于 2012-06-26T11:19:37.027 回答
1

您还可以通过放置来防止批量分配

config.active_record.whitelist_attributes = true

在你的 config/application.rb

现在所有的属性都必须明确标记为可访问。它通过为您的应用程序中的所有模型创建一个空的属性白名单来实现这一点。

于 2012-06-27T04:32:59.070 回答