12

我正在研究一个从服务器端调用的 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 脚本显示错误而不是“内部服务器错误”?

更新:

我应该为此提出一个单独的问题,因为我已经了解到这确实会向浏览器发送错误(感谢布赖恩):

use CGI::Carp qw(fatalsToBrowser);

但是,如果问题出在 Apache 配置而不是 Perl 脚本,则错误不会发送到浏览器,因为 Perl 代码没有被解释。在这种情况下,我们可以说我遇到了 Apache 错误(而不是 Perl 错误),因为这行:

 suexec policy violation: see suexec log for more details

当 Apache 在 SUexec 模式下运行时会发生这种情况(这对于共享主机来说似乎很常见)。我不确定究竟是什么改变导致了这个错误,但这就是我想要找出的。

4

4 回答 4

17

可能您正在使用共享主机并且您遇到此问题,因为您的脚本目录脚本文件确实具有除755.

这是一个从荷兰语翻译过来的案例。

于 2010-01-09T15:30:03.680 回答
7

使用CGI::CarpfatalsToBrowser.

 use CGI::Carp qw(fatalsToBrowser);

您可能还想查看我的Perl CGI 脚本疑难解答

从错误消息中,我猜您不允许从服务器端包含执行 CGI 脚本。您正在运行哪个版本的 Apache?如果它是旧的 apache,请参阅suexec docs for apache 1.3,或者如果它是较新的 apache,请参阅suexec docs for apache 2.0

于 2010-01-09T14:54:56.133 回答
2

这不是为了用户友好,而是为了安全,当用户无能为力时,我们不会向用户显示确切的错误。例如,假设后端服务器不可用。作为用户,我可以做些什么来在您的 Web 应用程序中解决这个问题?

在某些情况下,错误消息将包含有用的信息,例如“SQL 错误:非法语法。不匹配的 '”。如果用户在其输入中输入了引号,则此反馈将表明存在 SQL 注入漏洞。

其他看起来温和的消息也不好向用户展示。攻击者想要知道的关键是“发生了不同的事情”。如果应用程序为一个输入输出一个错误,另一个输入输出另一个错误,那么攻击者就知道有不同的地方出错了,这是一个有趣的关注点。

在生产站点中,应将错误记录到文件中,并在适当的情况下通过您的 Web 界面下载 - 但要非常小心地清理浏览器的任何输出以避免跨站点脚本。并且不应该有用户提交的选项来在调试和生产之间重新配置它(不要通过 POST 或 CGI 参数控制它,而是通过配置文件选项)。

于 2010-01-09T15:00:58.403 回答
0

这可能是3个因素:

  1. 权限级别 rwx 设置错误(执行/写入级别)
  2. UUID/GUID 与 Apache 设置不匹配
  3. 以上2的组合。

检查 apache suexec+errorlog 了解详情

于 2017-08-12T18:38:43.473 回答