1

我正在阅读 Hartl 的 Rails 教程。我已经完成了 9.6 的第一个练习,他要求我测试 Useradmin属性是否不可访问。本书前面的理由是:

清单 9.42之后,Hartl 的 Rails 教程说

如果我们在 User 模型中省略了 attr_accessible 列表(或者愚蠢地将 :admin 添加到列表中),恶意用户可以发送 PUT 请求,如下所示:

put /users/17?admin=1

教程中的相应练习(练习 9.6.1 )说

添加测试以验证 User admin 属性不可访问

我已经使用以下代码完成了该测试user_spec.rb

expect do
  @user.update_attributes(:admin => true)
end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)

但我使用 stackoverflow 来进行测试。 这是我最初的想法(在user_pages_spec.rb):

expect do
    put user_path(user) + "?admin=1"
end.to raise_error(ActiveModel::MassAssignmentSecurity::Error) # or some other error

但我无法让它工作。

所以我的问题是:

  1. 我的想法可行吗?直接测试潜在黑客可能从命令行执行的操作不是更好吗?这不就是 Capybara 的想法,测试用户行为吗?

  2. 如果可能,测试质量分配和测试 PUT 动作之间是否有区别?

  3. 如果不可能,为什么? 只是没有必要还是我在这里遗漏了什么?

4

1 回答 1

1

我想我会和你争论,你的测试实际上更好。有些人会争辩说,给定的答案是测试 Rails 功能,这真的不是你的工作。但是,我确实认为从几个不同的方向测试事物通常是件好事。

我在学生时代的印象是,除了执行 GET 之外,不可能通过 URI 发送数据。快速搜索 stackoverflow 并没有得到任何确认。但是,维基百科文章似乎暗示了这一点:

http://en.wikipedia.org/wiki/POST_%28HTTP%2

我认为正确的代码行是

put user_path(user), {user: {admin: 1}, id: user.id}

我希望这会有所帮助。

于 2013-01-31T05:06:53.630 回答