我对表格的工作方式不熟悉。
示例场景
让我们说,用户可以创建调查,但是在创建之后,不能编辑它们,而只能向它们添加问题。这是通过在调查中使用编辑操作来完成的。
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 %>现在,这是否会让“调查”的价值观变得脆弱或被黑客攻击,即使我希望调查的字段在创建后无法使用?
一般情况下呢?当模型值不在表单上时仍然可以编辑吗?这背后的逻辑是什么,我怎么知道他们不能呢?
谢谢,只是个新手想学。
发布于 2012-06-26 11:18:31
是的,这些属性仍然可以通过将它们作为参数提交到表单中进行编辑,即使您没有为它们提供字段。
为了防止这种情况,您可以使用显式保护属性 (在以后的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-27 04:32:59
你也可以通过
config.active_record.whitelist_attributes = true在您的config/application.rb .
现在所有的攻击都必须显式地标记为可访问的。它通过为应用程序中的所有模型创建一个空的属性白名单来做到这一点。
https://stackoverflow.com/questions/11205965
复制相似问题