HTTP协议中的连接复用问题主要指客户端与服务器之间的连接被重复使用,但两次请求属于不同的上下文,导致交叉污染等问题。这通常由以下原因导致:
- 缺少 Connection 头指示: 客户端未指示连接复用,但服务端仍然复用连接,导致上下文污染。
- 上下文污染: 两次请求属于不同用户或会话,但通过同一连接传输,导致信息泄露等问题。
- PIPELINE 阻塞: 后续请求被阻塞,等待前序请求返回,影响用户体验。
- 流水线攻击: 恶意请求被注入流水线,并在其余正常请求之前执行,导致潜在威胁。
避免方法:
- 明确指示连接复用与否,避免服务端误判。
- 每次请求都包含识别会话或身份的信息,区分不同上下文。
- 限制流水线中请求数量,避免后续请求被长时间阻塞。
- 对身份验证等敏感请求禁用流水线,并显性关闭连接,避免信息泄露风险。
- 服务端对流水线请求进行过滤与验证,阻止恶意请求执行。
代码示例:
连接复用 indicator:
Connection: Keep-Alive // 表示连接复用
Connection: Close // 表示关闭连接
会话标识:
Cookie: session=abc123; // 会话Cookie标识用户
Authorization: Bearer ... // 授权Token标识用户
限制流水线请求:
nginx
http {
...
keepalive_requests 100; // 最大流水线请求数为100
}
关闭连接:
nginx
location ~* ^/auth$ { // 身份验证接口
...
proxy_http_version 1.1;
proxy_set_header Connection ""; // 关闭代理连接
}
过滤流水线请求:
nginx
location ~* ^/upload$ {
...
limit_except GET { // 限制除GET之外的流水线请求
return 403;
}
}