我正在研究一个Perl脚本,该脚本是从Apache 2服务器上的服务器端调用的。该脚本显示通用的“内部服务器错误”页面,而不是显示实际错误。当我检查Apache错误日志时,我看到以下消息:
unable to include "/foobar/index.pl" in parsed file /home/foouser/domains/foosite.com/public_html/foobar/index.shtml, referer: http://www.foosite.com/foobar/
suexec policy violation: see suexec log for more details, referer: http://www.foosite.com/foobar/
Premature end of script headers: settings.pl, referer: http://www.foosite.com/foobar/
如何让Perl脚本显示错误而不是“内部服务器错误”?
我本来应该问一个单独的问题,因为我已经知道这个 向浏览器发送错误(thanks brian):
use CGI::Carp qw(fatalsToBrowser);
但是,如果问题出在Apache配置而不是Perl脚本上,那么错误将不会发送到浏览器,因为没有解释Perl代码。在这种情况下,由于这一行,我们可以告诉我遇到Apache错误(而不是Perl错误):
suexec policy violation: see suexec log for more details
当Apache以SUexec模式运行时(这似乎是共享主机通用),会发生这种情况。我不确定究竟是什么改变了导致这个错误,但这就是我想要找到的。
答案 0 :(得分:16)
您可能正在使用共享托管,但由于您的脚本目录或脚本文件具有除755
之外的其他权限,因此您遇到此问题。
这是荷兰语翻译的一个case。
答案 1 :(得分:6)
使用CGI::Carp的fatalsToBrowser
。
use CGI::Carp qw(fatalsToBrowser);
您可能还想查看我的Troubleshooting Perl CGI scripts。
从错误消息中,我猜你不允许从服务器端包含执行CGI脚本。您运行的是哪个版本的Apache?如果它是旧的apache,请参阅the suexec docs for apache 1.3,或者如果它是较新的apache,请参阅the suexec docs for apache 2.0。
答案 2 :(得分:2)
这不是为了用户友好,但通常为了安全起见,当用户无法对此做任何事情时,我们不会向用户显示确切的错误。例如,假设后端服务器不可用。作为用户,我可以在Web应用程序中做些什么来解决这个问题?
在某些情况下,错误消息将包含有用的信息,例如“SQL错误:非法语法。无法匹配”。如果用户在其输入中输入了引号,则此反馈将指示SQL注入漏洞。
其他良性外观的消息也很难向用户展示。攻击者想要的关键是要知道“发生了不同的事情”。如果应用程序为一个输入打印出一个错误,为另一个输入打印另一个错误,那么攻击者就会知道不同的错误,并且这是一个有趣的地方。
在生产站点中,应将错误记录到文件中,并且如果合适,可以通过Web界面下载 - 但要非常小心地清理浏览器的任何输出以避免跨站点脚本。并且应该没有用户提交的选项来在调试和生产之间重新配置它(不要通过POST或CGI参数控制它,而是通过配置文件选项控制它。)
答案 3 :(得分:0)
这可能是3个因素:
检查apache suexec + errorlog以获取详细信息