【问题标题】:GET vs POST in REST Web ServiceREST Web 服务中的 GET 与 POST
【发布时间】:2013-04-09 10:35:36
【问题描述】:

我正在开发一项 REST 服务,该服务允许用户根据发票上显示的几条信息(发票编号和帐单邮编)声明他们的列表。

我已经阅读了无数关于何时使用 GET 和何时使用 POST 的文章和 Stack Overflow 问题。总的来说,普遍的共识是 GET 应该用于幂等操作,而 POST 应该用于在服务器端创建某些东西的操作。不过这篇文章:

http://blog.teamtreehouse.com/the-definitive-guide-to-get-vs-post

让我对在这个特定场景中使用 GET 产生疑问,仅仅是因为我使用这两条信息作为验证用户身份的机制。我没有使用这个特定的方法调用来更新服务器上的任何内容,但我也不一定想在 URL 中公开信息。

这是一个内部 Web 服务,只有调用该服务的前端是公开的,所以我不必担心 URL 会出现在用户的浏览器历史记录中。我唯一担心的是不太可能有人获得服务器日志访问权限,在这种情况下,我会遇到更大的问题。

出于安全原因,我倾向于使用 POST;然而,由于请求是幂等的,GET 感觉是正确的方法。这种情况下推荐的方法是什么?

【问题讨论】:

    标签: rest


    【解决方案1】:

    您的问题始于一些错误的假设。首先,GET 不只是针对任何旧的幂等操作,它针对来自服务器的GETting 资源;只是碰巧这样做应该没有副作用。其次,URL 不是 GET 请求向服务器发送数据的唯一方式,您可以使用带有 GET 请求的有效负载(至少就 HTTP 而言,有些实现很糟糕,不支持这或让它变得困难)。第三,正如所指出的,您选择了一些糟糕的数据字段来保护您的访问。最后,您以任何方式使用纯文本协议,因此这两种方法都没有真正提供什么以及更好的安全性。

    你应该使用最能描述你在做什么的动词,你正在从服务器获取一些信息,所以使用GET。使用一些适当的安全性,例如基本的 HTTPS 加密。如果您想避免这些字段“堵塞” URL,您可以在请求的有效负载中发送数据,例如:

    GET /listings HTTP/1.1
    Content-Type = application/json
    
    { "zip"     : "IN0N0USZ1PC0D35",
      "invoice" : "54859081145" }
    

    【讨论】:

      【解决方案2】:

      POST 与 GET 相比,实际上并没有增加任何安全性。当然,请求不在 URL 中,但我们在这里讨论的是 REST,而且 URL 无论如何都不会被人类看到。

      【讨论】:

      • 正确。我知道这两种方法都没有固有的安全性,只是 POST 参数不会出现在日志文件中。就像你说的,我想当它是一个 REST 请求时并不重要。
      • 有些人认为 POST 更安全,因为 Web 服务器可以记录 URL 并将数据泄漏到一个地方,这并不是本应如此。我真的不认为这是一个实际问题,但理论已经存在。
      • @LeeWhitney 好点。好吧,无论如何,您绝对不应该使用 GET 发送密码。 :-)
      • @LennartRegebro 这不是GET 的问题,而是不安全的 HTTP 请求。
      【解决方案3】:

      独立于 POST 与 GET,我建议不要将您的安全性作为简单的邮政编码和发票号码。我敢打赌发票编号是连续的(或接近的),而且周围没有那么多邮政编码 - 瞧,我可以完全访问您的列表。

      如果您使用的是另一种身份验证方法(通常在 HTTP 标头中),那么您很好 - 如果 URL 有发票编号并不重要,那么不妨使用 GET。

      如果你不是,那么我想 POST 在暴露机密内容方面并不像 GET 那样糟糕。

      【讨论】:

      • 感谢您的回复。这证实了我对这个话题的看法,尽管 POST 对于幂等请求感觉不对。虽然我同意可以使用更安全的验证方法,但这是业务需求,我想这将是不同讨论的主题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多