【问题标题】:Rails: Sending PUT Request using curl/Postman to update an attributeRails:使用 curl/Postman 发送 PUT 请求以更新属性
【发布时间】:2015-03-22 11:02:03
【问题描述】:

我正在阅读 Michael Hartl 的 Rails 教程书,在 Strong Parameters 部分它说

恶意用户可以如下发送 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'

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

【问题讨论】:

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


    【解决方案1】:

    要在 URL 查询中模拟嵌套属性,您可以编写如下内容: http://localhost:3000/users/17?user[admin]=1 但是如果是 PUT 的话,在请求体中做会更准确。

    在 postman 中,您可以简单地切换到 TEXT 模式并编写您的 JSON

    {"user": {
        "admin": 1
        }
    }
    

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

    Accept:application/json
    Content-Type:application/json
    

    祝你好运!

    【讨论】:

    • 谢谢先生,你真的成功了!!但我还有一个问题。在我使用 Postman 发送 PATCH/PUT 请求后,该请求似乎被发送了多次。开发日志中,除了第一次commit大约169ms外,还出现了大约10+块信息如下,请您解释一下原因?
    • 在 2015 年 3 月 23 日 10:25:09 +0800 由 UsersController#update 处理为 JSON 参数:{"user"=>{" admin"=>1}, "id"=>"17"} 用户负载 (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 17]] (0.1ms) 开始事务用户存在 (0.2ms) SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('j@w .l') AND "users"."id" != 17) LIMIT 1 (0.1ms) commit transaction Redirected to localhost:3000/users/17 Completed 302 Found in 5ms (ActiveRecord: 0.5ms)
    【解决方案2】:

    回复帖子所有者已经很晚了,但我只是希望它可以帮助其他人。

    curl -v -XPUT -H 'Accept: application/json' -H 'Content-Type: application/json' http://localhost:3000/users/17 -d '{"user": { "admin": "1" }}'

    我不确定是否需要引用值 1。您可以尝试带或不带引号。

    【讨论】:

      【解决方案3】:
      curl -v -XPATCH http://localhost:3000/users/17 -d '{"user": { "admin": 1 } }'
      

      如果它是 PATCH(或 PUT)标头,则不能将 ?admin=1 添加到您的请求中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-15
        相关资源
        最近更新 更多