最近,我发现了与 CGI 相关的漏洞,因此我阅读了一些相关内容,并提出了一个问题。请注意,我自己从未使用过 CGI,也不使用 PHP 或 Perl 编写代码,因此我可能遗漏了一些显而易见的内容。
据我了解,响应消息必须由脚本写入 STDOUT,包括两个都标头和正文。那么为什么不从 STDIN 读取包括标头和正文在内的整个请求消息呢?为什么要删除标头并将其分配给环境变量呢?
答案1
发送到 Stdout 的响应消息仅包含 CGI 希望添加的任何附加标头。主机 Web 服务可能会在将这些标头发送到客户端之前替换或更改这些标头。此外,一般还会添加其他标头。
至于传入标头,将解析这些标头的负担和风险转嫁给 CGI 是完全没有意义的。解析错误会产生各种漏洞。Web 服务器主机是处理此问题的最佳选择。
然而,对于 FastCGI 来说情况又有所不同,因为环境变量不再是一个选项,因为 CGI 进程保持驻留。