#4760·gin

Engine.Run 在没有默认超时的情况下启动 HTTP 服务器

作者: GG-Feng创建于 2026年7月25日更新于 2026年8月6日
标签type/bug

说明

□ 总结

  • 发动机。 运行开始“http. 服务器`不读取、写取、闲置或标题超时。

这使得使用默认“运行”帮助器的应用程序暴露在缓慢的客户端资源耗竭中,除非它们手动创建和配置自己的“http”。 服务器。

□ 受影响的代码

文件: " Gin.go "

开始 服务器 := & http.Server{ /#nosec G112 添加器:地址, 掌柜:发动机. 处理器( ), {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 错误=服务器。 听和塞尔维( )


" ReadTimout " 、 " WriteTimout " 、 " ReadheaderTimout " 和 " IdleTimeout " 均按零值计算。

□再现.

我用一个最小的Gin服务器 复制了它 启动的默认运行路径。

一个TCP客户端只发送了部分HTTP请求头,等待了20秒,然后完成了请求:

页:1
获取/正在编写 HTTP/1.1
主机: 本地主机

20秒暂停后,连接仍然活了下来,服务器在请求完成后返回了正常响应:

页:1 HTTP/1.1 200 已经确定 内容- 类型 :


这表明未默认适用 " ReadheaderTimeout " 。

□ 预期行为

默认服务器启动帮助器要么应用安全超时默认,要么强烈地引导用户转向超时配置的服务器用于生产.

□ 实际行为

- 发动机。 运行“ 启动一个没有默认超时的 HTTP 服务器 。

□ 影响

慢客户端可以通过延迟请求头来保持连接打开. 如果同时连接足够缓慢,这可以消耗服务器连接资源并降低可用性.

□ 建议修补

- 考虑在`Run ' 帮助者中设置保守的默认“ReadheaderTimeout”。
- 或者,增加一个安全生产助手或显著文件警告,即`工程'。 运行不配置超时 。
- 建议使用明确配置的`http.Server'进行生产部署。

QQ 银版

承诺34dac20时的当地人参/人参结账

你能复制虫子吗?

对

QQ 源代码

开始
主软件包

导入( E)
"网/http" (中文(简体) ).

"GitHub.com/gin-gonic/gin" 互联网档案馆的存檔,存档日期2013-12-02.
(中文(简体) ).

func 主 () {
r:= 杜松子酒. Default () (中文(简体) ).

r.GET ("/平"), func (c *gin.context) {
c. String(http.statusOK,"pong") 互联网档案馆的存檔,存档日期2011-12-21.
) (中文(简体) ).

如果错误 :=r.Run(":8080"); 错误 != 0 {
恐慌( err)
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

运行服务器 :

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 去运行。


在另一个外壳中, 打开一个 TCP 连接, 只发送一个部分 HTTP 请求头 :

{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
执行 3<>/dev/tcp/localhost/808080
打印“ GET /正中 HTTP/1.1\r\nhost: localhost\r\n” @% 3
睡觉 20
打印“\r\n”% 3
超时 3 dd bs = 1 计数 = 80 <&3 2 >/ dev/null

观察行为 :

页:1 HTTP/1.1 200 已经确定 内容- 类型 :


连接在20秒后仍然开放,服务器在请求头完成后正常响应,显示"ReadheaderTimeout"默认不适用.

QQ 转到版本

在DockerGLANG : 1.26中,走1.26.5分

操作系统

Linux, Docker Golang: 1.26 容器内