Rails:使用curl / Postman发送PUT请求来更新属性

时间:2015-03-22 11:02:04

标签: ruby-on-rails ruby curl strong-parameters postman

我正在阅读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客户端)中实现此目的?

3 个答案:

答案 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。您可以在有或没有引用的情况下尝试。