我正在阅读Hartl的Rails教程。我接受9.6的第一次练习,他要求我测试用户admin
属性是否无法访问。理由是在书的前面:
在Listing 9.42之后,Hartl的Rails教程说
如果我们在User模型中省略了attr_accessible列表(或者愚蠢地添加:admin到列表中),恶意用户可以发送PUT请求,如下所示:
put /users/17?admin=1
教程中的相应练习(exercise 9.6.1)说
添加测试以验证无法访问用户管理属性
我已使用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
但我无法让它发挥作用。
所以我的问题是:
我的想法可能吗?直接测试潜在的黑客可能会从命令行做什么更好?这不是Capybara的想法,测试用户行为吗?
如果可能,测试质量分配和测试PUT操作之间是否存在差异?
如果不可能,为什么?是不是没有必要,或者我在这里遗漏了什么?
答案 0 :(得分:1)
我想我会和你争辩说你的测试实际上更好。有人会说,给定的答案是测试Rails功能,这实际上不是你的工作。但是,我确实认为在几个不同的方向上进行测试通常很有用。
我在学校时代的印象是,除了做GET之外,不可能通过URI发送数据。快速搜索stackoverflow并未导致任何确认。但是,维基百科文章似乎暗示了它:
http://en.wikipedia.org/wiki/POST_%28HTTP%2
我认为正确的代码行是
put user_path(user), {user: {admin: 1}, id: user.id}
我希望有所帮助。