【问题标题】:Why shouldn't data be modified on an HTTP GET request?为什么不应该在 HTTP GET 请求上修改数据?
【发布时间】:2010-10-16 21:18:16
【问题描述】:

我知道使用非 GET 方法(POST、PUT、DELETE)来修改服务器数据是做事的正确方法。我可以找到多个资源声称 GET 请求不应更改服务器上的资源。

但是,如果今天有客户来找我说“我不在乎做事的正确方法是什么,如果我们可以使用调用 URL 并获得一些XML 返回 - 我们不希望构建 HTTP 请求和 POST/PUT XML,“我可以提供什么有利于商业的理由来说服他们?

是否存在缓存影响?安全问题?我在寻找的不仅仅是“它在语义上没有意义”或“它让事情变得模棱两可”。

编辑:

感谢到目前为止有关预取的答案。我不太关心预取,因为主要是围绕内部网络 API 的使用,而不是可访问的 HTML 页面,这些页面会有可以被浏览器预取的链接。

【问题讨论】:

  • 关于预取,您的浏览器可能会这样做,而不是机器人。

标签: http get


【解决方案1】:
  • 预取:很多网络浏览器都会使用预取。这意味着它会在您单击链接之前加载一个页面。预计您稍后会单击该链接。
  • 机器人:有几个机器人可以扫描和索引互联网以获取信息。他们只会发出 GET 请求。出于这个原因,您不想从 GET 请求中删除某些内容。
  • 缓存: GET HTTP 请求不应该改变状态并且它们应该是幂等的。幂等意味着发出一次请求,或多次发出请求会给出相同的结果。 IE。没有副作用。因此,GET HTTP 请求与缓存紧密相关。
  • HTTP 标准是这样说的:HTTP 标准说明了每种 HTTP 方法的用途。有几个程序是为使用 HTTP 标准而构建的,它们假设您将按照您应该的方式使用它。因此,如果您不遵守,您将在大量随机程序中出现未定义的行为。

【讨论】:

  • “GET HTTP 请求不会改变状态并且它们是幂等的”——这才是重点——它们本身并不是幂等的,预计它们会以这样的方式使用。
【解决方案2】:

Google 在 URL 中找到包含所有 GET 参数的该页面的链接并时不时地重新访问它怎么样?这可能会导致灾难。

The Daily WTF 上有一个关于此的 funny article

【讨论】:

    【解决方案3】:

    GET 可以强制用户使用并导致跨站点请求伪造 (CSRF)。例如,如果您在http://example.com/logout.php 有一个注销功能,它会更改用户的服务器状态,那么恶意人员可以在任何使用上述 URL 作为其来源的站点上放置一个图像标签:http://example.com/logout.php。加载此代码将导致用户退出。在给出的示例中没什么大不了的,但如果这是一个将资金从账户中转出的命令,那将是一个大问题。

    【讨论】:

    • POST请求和其他请求也可以通过这种方式伪造,但它需要能够在客户端运行脚本(即您可以通过加载图像执行GET,但您需要AJAX调用POST),所以它不会显着提高安全性,但确实有帮助。
    • AJAX 请求不能跨域,GET 请求可以。因此,malware-domain.xxx 可以嵌入 good-domain.angel/transfer_funds?amt=all&to=bad_guy">。如果您通过 good-domain 进行了身份验证,并且 bad_buy 可以让您访问该页面,那么他就得到了您所有的钱。
    • 请注意,针对 CSRF 的防御措施仍然允许您拥有可操作的 URL,但这并不是原始问题的真正重点。
    【解决方案4】:

    以正确的方式做事的充分理由......

    它们是行业标准、有据可查且易于保护。虽然您完全支持让客户的生活尽可能轻松,但您不希望实施在短期内更容易的东西,而是希望实施对他们来说不太容易但能带来长期利益的东西。

    我最喜欢的一句话

    又快又脏……很久以后 Quick 已经离开了肮脏的残骸。

    对你来说,这是“一针及时节省九针”;)

    【讨论】:

      【解决方案5】:

      安全性: CSRF 在 GET 请求中要容易得多。

      使用 POST 不会无论如何保护你,但 GET 可以通过使用接受图像标签的论坛和地方来引导更容易的利用和大规模利用。

      根据您在服务器端执行的操作,使用 GET 可以帮助攻击者启动 DoS(拒绝服务)。攻击者可以在图像标签中使用您昂贵的 GET 请求向数千个网站发送垃圾邮件,这些网站的每个访问者都会对您的 Web 服务器执行这个昂贵的 GET 请求。这会给你带来很多 CPU 周期。

      我知道无论如何有些页面很重,这总是有风险,但如果在每个 GET 请求中添加 10 条大记录,风险就会更大。

      【讨论】:

        【解决方案6】:

        一个人的安全。如果网络爬虫遇到删除链接,或者用户被诱骗点击超链接,会发生什么情况?用户在实际操作之前应该知道他们在做什么。

        【讨论】:

          【解决方案7】:

          我想寻找的不仅仅是“它在语义上没有意义”或“它让事情变得模棱两可”。

          ...

          我不在乎做事的正确方法是什么,这对我们来说更容易

          告诉他们想想他们用过的最糟糕的 API。他们无法想象这是如何由扩展的快速破解造成的吗?

          如果你从语义上有意义的东西开始,2 个月后会更容易(也更便宜)。我们称之为“正道”是因为它让事情变得更容易,而不是因为我们想折磨你。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-30
            • 2011-01-16
            • 2021-04-11
            • 2015-03-03
            • 1970-01-01
            相关资源
            最近更新 更多