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 容器内
内容来源: gin-gonic/gin