我正在阅读Michael Hartl的Rails教程书,并在强参数部分中说
恶意用户可以按如下方式发送PATCH请求:
补丁 / users / 17?admin = 1
此请求会使用户17成为管理员,这可能是一个严重的安全漏洞。
然后我决定成为一个"恶意用户"我自己也能更好地理解它。
所以我添加了:admin到用户控制器中允许的属性列表,并在Linux中使用curl发送PUT / PATCH请求,并在控制台中查看admin属性是否真的通过发送恶意请求得到更新。
curl -X PUT http://localhost:3000/users/17?admin=1
首先它抱怨"无法验证CSRF令牌的真实性" ,然后我注释掉了
# protect_from_forgery with: :exception
在应用程序控制器中也消除了一些before_actions只是试图让它工作,但我陷入了抱怨的地步
ActionController::ParameterMissing (param is missing or the value is empty: user):
app/controllers/users_controller.rb:49:in `user_params'
app/controllers/users_controller.rb:37:in `update'
然后我意识到我可能必须将用户参数传递为params哈希的散列才能使其工作。如何在curl或Postman(chrome REST客户端)中实现此目的?
答案 0 :(得分:4)
要在URL查询中模拟嵌套属性,您可以编写如下内容:
http://localhost:3000/users/17?user[admin]=1
但如果它是PUT,那么在请求正文中执行它会更准确。
在邮差中,您只需切换到TEXT模式并编写JSON
即可{"user": {
"admin": 1
}
}
但是如果你这样做,不要忘记为Rails服务器添加所需的Headers以了解你正在使用JSON:
Accept:application/json
Content-Type:application/json
祝你好运!
答案 1 :(得分:0)
curl -v -XPATCH http://localhost:3000/users/17 -d '{"user": { "admin": 1 } }'
如果它是PATCH
(或PUT
)标题,则您无法将?admin=1
添加到您的请求中。
答案 2 :(得分:0)
回复帖子的主人已经很晚了,但我希望它可以帮助其他人。
curl -v -XPUT -H 'Accept: application/json' -H 'Content-Type: application/json' http://localhost:3000/users/17 -d '{"user": { "admin": "1" }}'
我不确定是否需要引用值1。您可以在有或没有引用的情况下尝试。