全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Go 中 HTTP 请求体是否被自动缓冲?

go 的 `http.request.body` 不会自动全量缓冲,服务器在接收到请求头后立即调用 `servehttp`,而请求体按需读取;若不主动读取或限制读取超时,慢速攻击(如 slowloris)可能导致连接长期占用和内存/连接数耗尽。

在 Go 的 net/http 包中,http.Request.Body 是一个实现了 io.ReadCloser 接口的流式读取器(通常是 *io.LimitedReader 包裹的底层网络连接),它本身不预先缓存整个请求体。这意味着:

  • ✅ 服务器在解析完 HTTP 请求头(即 GET /path HTTP/1.1 及其 headers)后,立即调用你的 ServeHTTP 方法,无需等待请求体(如 POST 数据)传输完成;
  • ❌ r.Body 不是内存中的字节切片或缓冲区,而是对底层 net.Conn 的封装——数据仅在你显式调用 io.ReadAll(r.Body)、r.ParseForm()、json.NewDecoder(r.Body).Decode() 等读操作时,才从 TCP 连接中按需拉取;
  • ⚠️ 但这也带来风险:如果你的 handler 完全忽略 r.Body(例如对 POST 请求不做任何读取),该连接将保持打开状态,底层 socket 缓冲区可能持续积压未读数据,而 Go 的 HTTP server 不会主动关闭空闲的请求体读取连接——这正是 Slowloris 类攻击的突破口。

正确应对方式:超时控制 + 主动读取

最直接、有效的防护不是依赖“是否缓冲”,而是通过 连接级与读取级超时 来限制恶意行为:

server := &http.Server{
    Addr:         ":8080",
    Handler:      &MyHandler{},
    ReadTimeout:  5 * time.Second,  // 从连接建立到读完 request header 的总时间上限
    ReadHeaderTimeout: 2 * time.Second, // 仅限制读取 header 的时间(Go 1.8+)
    WriteTimeout: 10 * time.Second,
    IdleTimeout:  30 * time.Second,
}
log.Fatal(server.ListenAndServe())
? 关键说明: ReadTimeout 从 Accept 开始计时,覆盖 header 解析 + body 读取全过程; ReadHeaderTimeout 更精准,仅约束 header 解析阶段(防止 header 慢速攻击); 即使 handler 内部未读 r.Body,超时仍会触发连接关闭,避免资源长期悬挂。

此外,在业务逻辑中也应主动、有界地消费请求体,尤其对大文件上传或未知大小的 POST:

func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.Method == "POST" {
        // 限制最大读取量(例如 10MB),防止 OOM
        limitedBody := http.MaxBytesReader(w, r.Body, 10<<20)
        data, err := io.ReadAll(limitedBody)
        if err != nil {
            http.Error(w, "Request body too large or read error", http.StatusRequestEntityTooLarge)
            return
        }
        // 处理 data...
    }
}

总结

  • Go 不自动缓冲整个 r.Body,但也不强制你立即读取——这赋予灵活性,也带来责任;
  • 慢速 POST 攻击的风险根源在于无超时的长连接 + 未读 Body,而非“Go 是否缓冲”;
  • 生产环境必须配置 ReadTimeout / ReadHeaderTimeout,并结合 http.MaxBytesReader 对请求体设限;
  • 切勿假设“不读 Body 就没事”——未读的 Body 会让连接持续挂起,成为 DoS 温床。

遵循以上实践,即可在保持 Go 高并发优势的同时,有效抵御 Slowloris 及类似资源耗尽型攻击。


# js  # json  # go  # 字节  # 封装  # 接口  # 切片  # 并发  # http  # 慢速  # 按需  # 是一个  # 这也  # 可在  # 但也  # 会让  # 不做  # 而非  # 若不 


相关文章: 专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  网页设计网站制作软件,microsoft office哪个可以创建网页?  PHP 500报错的快速解决方法  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  建站之星如何实现五合一智能建站与营销推广?  如何快速查询域名建站关键信息?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  建站之星云端配置指南:模板选择与SEO优化一键生成  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  如何在Ubuntu系统下快速搭建WordPress个人网站?  如何确认建站备案号应放置的具体位置?  建站为何优先选择香港服务器?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  MySQL查询结果复制到新表的方法(更新、插入)  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  兔展官网 在线制作,怎样制作微信请帖?  网站制作价目表怎么做,珍爱网婚介费用多少?  如何高效完成自助建站业务培训?  如何配置FTP站点权限与安全设置?  潮流网站制作头像软件下载,适合母子的网名有哪些?  北京专业网站制作设计师招聘,北京白云观官方网站?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  如何在搬瓦工VPS快速搭建网站?  青浦网站制作公司有哪些,苹果官网发货地是哪里?  三星网站视频制作教程下载,三星w23网页如何全屏?  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Python lxml的etree和ElementTree有什么区别  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  如何在云主机上快速搭建网站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  专业网站建设制作报价,网页设计制作要考什么证?  高端云建站费用究竟需要多少预算?  广州商城建站系统开发成本与周期如何控制?  网站制作公司排行榜,抖音怎样做个人官方网站  如何制作网站标识牌,动态网站如何制作(教程)?  如何在云主机快速搭建网站站点?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  临沂网站制作公司有哪些,临沂第四中学官网?  小型网站建站如何选择虚拟主机?  C#如何序列化对象为XML XmlSerializer用法  网站插件制作软件免费下载,网页视频怎么下到本地插件?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  如何快速搭建高效简练网站?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。