V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lxy
V2EX  ›  分享发现

关于 GET、POST 的误解

  •  
  •   lxy · 2017-04-05 12:54:52 +08:00 · 2408 次点击
    这是一个创建于 2627 天前的主题,其中的信息可能已经有所发展或是发生改变。

    看到 一篇文章

    刷新了我对 GET 和 POST 的粗浅认识,总结一下主要观点就是:

    • GET 和 POST 请求都可以包含 Body , HTTP 协议没有对数据如何传输做出要求

    • HTTP 协议没有对 URL 长度进行限制

    • 数据传输安全性与 GET 、 POST 无关

    • 关于 GET 、 POST 的误解都来自于 HTML 标准

    有多少人知道或认同这些说法?如果面试的时候这么回答会不会有危险……

    10 条回复    2017-04-05 18:53:38 +08:00
    loading
        1
    loading  
       2017-04-05 12:57:26 +08:00 via Android
    如果密码用 get 发送,那么浏览器的浏览记录就能看到密码,还是有不同的。
    misaka19000
        2
    misaka19000  
       2017-04-05 12:58:11 +08:00 via Android
    这都是常识,如果面试官连这都不知道,那你也别去了
    ck65
        3
    ck65  
       2017-04-05 13:05:09 +08:00 via iPhone
    粗略说来,在这个知识点上,你在考面试官和未来共事的团队。
    explon
        4
    explon  
       2017-04-05 13:11:58 +08:00
    GET 的 URL 会被网络运营商记录, Web 日志记录, 浏览器记录
    otakustay
        5
    otakustay  
       2017-04-05 13:14:49 +08:00
    GET 可以有 BODY ,但一有 BODY 以后 client cache 会完蛋( undefined behavior ),同时导致 GET 不合 HTTP 协议( RFC
    2616 )的语义( The GET method means retrieve whatever information (in the form of an
    entity) is identified by the Request-URI ),所以 GET 加 BODY 是一个非常操蛋的搞法

    其它都是事实中的事实
    otakustay
        6
    otakustay  
       2017-04-05 13:16:29 +08:00
    关于 GET 和 BODY 的问题建议看下这里,应该会有更深刻的认识,不要被一些“发现规范没写就大叫着新大陆”的论断迷惑了: http://stackoverflow.com/questions/978061/http-get-with-request-body
    mcfog
        7
    mcfog  
       2017-04-05 13:20:24 +08:00
    + GET 可以包含 body ,但服务器端应当忽略 body 内容

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3

    if the request method does not include defined semantics for an entity-body, then the message-body SHOULD be ignored when handling the request.

    + URI 长度协议里写的很清楚,服务器只需要支持自己提供服务范围长度内的 URI 就可以,超长返回 414

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.2

    The HTTP protocol does not place any a priori limit on the length of a URI. Servers MUST be able to handle the URI of any resource they serve, and SHOULD be able to handle URIs of unbounded length if they provide GET-based forms that could generate such URIs. A server SHOULD return 414 (Request-URI Too Long) status if a URI is longer than the server can handle (see section 10.4.15).

    + 有关,标准里确实没有,但安全这件事复杂程度肯定是远超标准的。 GET 的所有数据只能在 QueryString 里传(见第一点), QueryString 又是个非常容易泄露的地方( nginx log/referer/browser history )

    + HTML 是标记语言,我不知道 HTML 的标准哪里会让人误解 POST / GET

    简单来说,不要看到一篇文章说了些和你认知不同又似是而非的东西就以为这篇文章是对的了,而且人家都贴了标准的链接了,点进去看一下花不了几分钟的
    tomczhen
        8
    tomczhen  
       2017-04-05 13:42:50 +08:00
    协议只是一种约定,规范是这种约定变成事实标准,但并不是说只能按约定来。

    可以在 GET 请求中放 BODY ,只要服务端事先跟你约定好会去处理 GET 请求里面的 BODY 。

    至于信息是在 URL 里面还是在 BODY 还是 Header ,非 https 的话其实运营商都能拿到。

    放在哪里是因为有 RFC 文档的约定实现,如果客户端按标准实现了,服务端返回不按标准来,会产生一些问题。

    反过来讲,如果能解决两端的约定问题,就算不按规范来也不是不行,只不过不具有通用性——其他使用服务的人还得再按非标准规范来实现一次。
    otakustay
        9
    otakustay  
       2017-04-05 14:21:30 +08:00
    @tomczhen 说白了就是基于一个协议生造出另一个协议呗
    wuling
        10
    wuling  
       2017-04-05 18:53:38 +08:00
    不赞同文章里面关于 GET/POST 安全方面的观点。

    安全本来就是个相对的概念, POST 在降低信息泄露上确实比 GET 好那么一点,这就足够了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   972 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:00 · PVG 04:00 · LAX 13:00 · JFK 16:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.