go 的 net/http 默认不防头部注入,必须手动过滤用户输入的 header 值和名:先 trimspace,再用 strings.containsany 检查 rnx00;header 名需白名单校验;fasthttp 等第三方库行为不同,须统一过滤并独立校验每层。

Go 的 net/http 默认不防头部注入,必须手动过滤
Go 标准库的 http.ResponseWriter 和 http.Header 本身不做任何 HTTP 头部字段合法性校验。如果你把用户输入直接拼进 SetHeader、WriteHeader 或 Header().Set,就可能触发 CRLF 注入(即注入 rn 换行符),导致响应拆分、缓存污染甚至 xss。
常见错误现象:http: invalid header field name 这类错误只在字段名含非法字符时触发,但字段值里的 rn 完全不会被拦截 —— 它会原样写入响应流。
- 所有用户可控的 header 值(如
X-forwarded-For、User-Agent、自定义X-Trace-ID)都必须过滤 - 不要依赖中间件或框架自动处理;标准
net/http没有这层防护 - 过滤时机必须在调用
w.Header().Set()或w.Header().Add()之前
用 strings.TrimSpace + strings.ContainsAny 快速清理 header 值
HTTP/1.1 规范要求 header 值不能含控制字符(尤其是 r、n、