305 是什么
305 Use Proxy 是 HTTP/1.1 早期定义的重定向码:服务器要求客户端通过指定代理访问目标资源,代理地址放在 Location 里。由于攻击者可以借此把客户端流量导向自己控制的代理,标准已明确将其废弃(RFC 9110 §15.4.6 注明不得使用),实现中不应再返回或依赖它。
基本信息
| 名称 | 305 Use Proxy |
|---|---|
| 类别 | 3xx |
| 旧规范 | RFC 2616 §10.3.6 |
| 现状 | RFC 9110 明确废弃,禁止使用 |
| 风险 | 伪造代理地址可劫持流量 |
| 正确做法 | 由客户端或系统显式配置代理 |
典型使用场景
- 安全审计:流量里发现 305 应视为异常实现或攻击尝试
- 老系统兼容性排查:确认客户端是否还在处理该码
- 代理配置的正确做法参考:客户端侧显式配置
- 协议历史理解:HTTP/1.1 早期重定向语义的演变
- 客户端实现评审:确认自家 SDK 不会自动跟随 305
- 事件响应:出现可疑响应头时的处置流程
正确做法与排查
正确做法与排查
# 正确做法:由客户端或系统显式配置代理,而不是接受服务端下发的 305
export https_proxy=http://proxy.internal:3128
curl -x http://proxy.internal:3128 https://example.com/ # 显式指定代理
# 排查:确认响应里到底出现了什么重定向码
curl -si https://example.com/ | head -5代理相关的正确姿势
| 需求 | 推荐做法 | 不推荐 |
|---|---|---|
| 出网走代理 | 客户端或系统环境变量配置 | 依赖服务端返回 305 |
| 企业出口管控 | 出口透明代理加证书管理 | 自建私有机制 |
| 按域名分流 | PAC 或分流规则 | 依赖 305 |
| 信任边界 | 代理证书链可审计 | 连接未知代理 |
305 存在被用于流量劫持的风险:客户端收到来源不明的 305 时,应按错误处理而不是自动连接 Location 指向的代理。
多数现代 HTTP 客户端(curl、浏览器、主流语言库)根本不实现 305,遇到时通常只当作未知的 3xx 处理。
代理配置的正确位置是客户端或系统侧,因为只有用户或运维能确认该代理是否可信。
若要统一管控出口,企业通常采用透明代理加证书管理的方式,而不是依赖服务端下发代理地址。
在日志里看到 305 时,优先确认是否为老中间件的历史行为,再评估是否存在主动攻击。