首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当表单上的字段不可用时,模型值还能被编辑吗?

当表单上的字段不可用时,模型值还能被编辑吗?
EN

Stack Overflow用户
提问于 2012-06-26 11:05:19
回答 2查看 90关注 0票数 3

我对表格的工作方式不熟悉。

示例场景

让我们说,用户可以创建调查,但是在创建之后,不能编辑它们,而只能向它们添加问题。这是通过在调查中使用编辑操作来完成的。

代码语言:javascript
复制
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

那么表格应该是:

代码语言:javascript
复制
<%= 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 %>

现在,这是否会让“调查”的价值观变得脆弱或被黑客攻击,即使我希望调查的字段在创建后无法使用?

一般情况下呢?当模型值不在表单上时仍然可以编辑吗?这背后的逻辑是什么,我怎么知道他们不能呢?

谢谢,只是个新手想学。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-26 11:18:31

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

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

代码语言:javascript
复制
attr_protected :name # or whatever other attributes that model has

这防止了那些属性的大量分配,无论是用于创建还是更新。要允许创建,您必须在createSurveyController操作中显式地分配这些属性

代码语言:javascript
复制
def create
  @survey = Survey.new # instead of Survey.new(params[:survey])
  @survey.name = params[:survey][:name]
  @survey.save 
  # etc
end

编辑:

正如blackbird07所指出的,更好的方法是白名单那些属性,您希望允许大量分配,而不是这里描述的黑名单方法。

票数 2
EN

Stack Overflow用户

发布于 2012-06-27 04:32:59

你也可以通过

代码语言:javascript
复制
config.active_record.whitelist_attributes = true

在您的config/application.rb .

现在所有的攻击都必须显式地标记为可访问的。它通过为应用程序中的所有模型创建一个空的属性白名单来做到这一点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11205965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档