Perl的-d调试开关导致无法读取表单POST的STDIN内容是正常现象吗
Perl开启-d开关无法读取POST内容问题解答
这是Perl调试器的正常设计特性,和主机配置没有关系。
根因说明
Perl的-d开关启动的交互式调试器,初始化阶段会主动从STDIN流读取用户输入的调试指令。而CGI协议下,POST请求的载荷内容正是通过STDIN传递给后端脚本的。你部署的主机环境(一般为Linux类系统)中,调试器会直接继承CGI进程的STDIN,启动时就把全部POST内容预读完了,业务代码执行read(STDIN, $buff, $ENV{'CONTENT_LENGTH'})的时候,STDIN已经到了EOF,所以读到的$buff是空值。
本地WAMP环境运行正常的原因是Windows下Perl调试器默认会将STDIN绑定到独立的控制台终端,不会读取CGI传递的请求输入流,所以本地测试不会触发该问题。
相关建议
- 生产环境的CGI脚本绝对不要加
-d调试开关,调试器本身是为交互式调试场景设计的,在Web服务场景下使用不仅会有输入冲突问题,还会带来明显的性能损耗,甚至存在安全隐患。 - 如果需要调试POST请求逻辑,可以先把POST内容、环境变量写入本地日志,基于日志内容离线复现调试,不要直接在线上服务启用调试器。
- 额外建议:尽量不要手动解析POST参数,使用Perl官方的
CGI.pm模块处理表单输入,可以自动规避编码、特殊字符转义、多参数拼接等很多常见的解析问题。
内容的提问来源于stack exchange,提问作者Vince Pelss
相关产品推荐
相关产品推荐

