0

在 Rails 3 中,我们可以定义可访问的属性:

attr_accessible :rating, :review

在这个模型中,有额外user_id的保护以防止伪造/黑客攻击。此值在控制器中分配:

@review.user_id = current_user.id

如果我使用 Firebug 手动包含user_id,它将成为 的一部分params[:review],但当然由于user_id未在 中定义attr_accessible,它不会被保存到数据库中。这种情况是相当安全的。

问题 1

我在Rails 3 In Action一书中读到,Yehuda Katz 包含.delete了在执行进一步操作之前删除未经授权的参数的方法:params[:review].delete(:user_id). 我是否应该也包含此内容以进一步保护我的应用程序,还是忽略此步骤?

问题2

如果我应该包含上面的方法,我想要将.delete_all_except它剥离到参数中允许的属性。我怎么做?

谢谢。

4

1 回答 1

1

如果启用,Rails 3.2 将在向模型发送额外的质量分配参数时出现异常

配置/应用程序.rb

config.active_record.whitelist_attributes = true

与其删除你不想要的参数,我建议只接受你想要的参数:

@user.update_attributes params[:user].slice(:rating, :review)

这只会返回您允许的用户参数。

注意:在 Rails 4(即将推出)中,这种行为是使用名为strong-parameters的 DSL 实现的。你可以在 Rails 3.2 中安装这个 gem 来实现:

@user.update_attributes params.require(:user).permit(:rating, :review)
于 2012-09-18T15:24:26.503 回答