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

jwo*_*ong 2 ruby curl ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

首先它抱怨“无法验证 CSRF 令牌的真实性”,然后我注释掉了

# protect_from_forgery with: :exception
Run Code Online (Sandbox Code Playgroud)

在应用程序控制器中,还消除了一些 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'
Run Code Online (Sandbox Code Playgroud)

然后我意识到我可能必须将用户参数作为参数哈希值的哈希值传递才能使其工作。如何在curl或Postman(chrome REST客户端)中实现此目的?

Uel*_*elb 5

要在 URL 查询中模拟嵌套属性,您可以编写如下内容: http://localhost:3000/users/17?user[admin]=1 但如果是 PUT 请求,则在请求正文中执行此操作会更准确。

在 postman 中,您只需切换到 TEXT 模式并编写 JSON

{"user": {
    "admin": 1
    }
}
Run Code Online (Sandbox Code Playgroud)

但如果您这样做,请不要忘记为 Rails 服务器添加所需的标头,以了解您正在 PUTing JSON :

Accept:application/json
Content-Type:application/json
Run Code Online (Sandbox Code Playgroud)

祝你好运 !