V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ranran
V2EX  ›  问与答

HTTP 协议 服务区发送数据给客户端可以 GZIP 压缩 那么反过来也可以?

  •  1
     
  •   ranran · 2016-08-20 14:46:25 +08:00 · 5792 次点击
    这是一个创建于 2777 天前的主题,其中的信息可能已经有所发展或是发生改变。
    就是 POST 请求是否也可以采用 gzip 压缩,然后服务器自行解压?
    16 条回复    2016-08-22 14:44:03 +08:00
    ranran
        1
    ranran  
    OP
       2016-08-20 14:47:27 +08:00
    一般服务器不支持吧?只能自行实现?
    skydiver
        2
    skydiver  
       2016-08-20 14:58:54 +08:00 via iPad   ❤️ 1
    为什么不可以呢,以及为什么不试一下呢
    ranran
        3
    ranran  
    OP
       2016-08-20 15:12:48 +08:00
    @skydiver 记得 post 文件的时候 都是 base64 编码 base64 会让内容变长好多 我突然很疑惑 为什么不用 gzip 这样的压缩算法呢

    我说的场景是基于浏览器的 而不是自己写程序纯传输用 如果纯传输用 自行拓展一下也是毫无疑问的不是么……

    老的 HTTP 协议那时候可能没考虑压缩…… 不知道 HTTP2 有没有相关的,毕竟 HTTP2 不是老协议了。

    @qgy18 来来来聊聊
    Zzzzzzzzz
        4
    Zzzzzzzzz  
       2016-08-20 15:29:05 +08:00   ❤️ 2
    post 数据只是做 url 编码, 并不会 gzip, 而且上传数据(multipart/form-data)连 url 编码都不会做.

    如果 post 的数据不大, 或者上传的是图片或者压缩文件一类, 这类情况 gzip 不仅不会压小, 还可能会变大,

    客户端是不可信任的, 理论上可以用简单的结构构造出一个压缩后极小但是解压后极大的数据来爆服务器内存.
    Zzzzzzzzz
        5
    Zzzzzzzzz  
       2016-08-20 15:29:28 +08:00   ❤️ 1
    "post 数据只是做 url 编码, 并不会 gzip, 而且上传数据(multipart/form-data)连 url 编码都不会做. "

    =>

    "post 数据只是做 url 编码, 并不会 base64, 而且上传数据(multipart/form-data)连 url 编码都不会做. "
    vibbow
        6
    vibbow  
       2016-08-20 15:45:53 +08:00   ❤️ 1
    post 数据可以压缩的
    vibbow
        7
    vibbow  
       2016-08-20 15:47:45 +08:00   ❤️ 1
    关键字:
    Content-Encoding: gzip
    fcicq
        8
    fcicq  
       2016-08-20 15:50:19 +08:00   ❤️ 1
    传统上某些 8-bit byte 会被砍掉首位所以只能传输 7-bit byte. url encode 和 base64 都能完成这个变换. 但是指定 content-type 为一种私有或者二进制类型很不好看, 推荐用 multipart 上传的方式, 稍微浪费一个头的空间还不算太离谱.
    qgy18
        9
    qgy18  
       2016-08-20 16:00:36 +08:00   ❤️ 3
    当然可以!而且我以前就写过相关文章:

    https://imququ.com/post/how-to-compress-http-request-body.html
    如何压缩 HTTP 请求正文
    qgy18
        10
    qgy18  
       2016-08-20 16:05:34 +08:00   ❤️ 1
    aprikyblue
        11
    aprikyblue  
       2016-08-20 16:19:56 +08:00 via Android   ❤️ 1
    @Zzzzzzzzz 按照最后这样逻辑的话,服务器也可以用简单的结构构造出一个压缩后极小但是解压后极大的数据来爆访问者内存?
    laoyur
        12
    laoyur  
       2016-08-20 16:45:23 +08:00   ❤️ 1
    如果服务端和客户端都是你做的,那你非要这么做当然可以,但是,一般的情况下服务端不是你控制的,
    你都不知道服务端支持不支持 gzip ,就直接传了压缩过的数据过去,让人家怎么处理?
    还有就是 4 楼提到的安全问题,如果服务端接受压缩过的数据,客户端扔一个 zip 炸弹上来,解压出来几十 G ,服务器处理不好的话岂不嗝儿屁
    julyclyde
        13
    julyclyde  
       2016-08-21 20:39:17 +08:00
    @fcicq HTTP 没这个传统。砍掉高位的那是传说中的古代 SMTP
    fcicq
        14
    fcicq  
       2016-08-21 21:52:11 +08:00
    @julyclyde 不过想一下在 UTF-8 以前也没啥压缩, 文本内容砍了高位根本没事. FTP 还分 text 和 binary...
    sivacohan
        15
    sivacohan  
       2016-08-21 23:07:51 +08:00 via Android   ❤️ 3
    @aprikyblue 你说的对,有一个反扒技术就是这样。利用 gzip 压缩一个 TB 级别的都是 0 的文件。目前浏览器对这种情况有拦截,不会出大问题。但一般爬虫不考虑这个,直接把磁盘爆掉。
    Zzzzzzzzz
        16
    Zzzzzzzzz  
       2016-08-22 14:44:03 +08:00   ❤️ 2
    @aprikyblue 有啊, gzip bomb, 但最多让浏览器崩一下, 主要用途倒是像楼上说的,对二三线爬虫有奇效.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5298 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 81ms · UTC 09:27 · PVG 17:27 · LAX 02:27 · JFK 05:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.