如何读取cgi-bin文件夹外的文件?

时间:2014-09-07 20:12:34

标签: perl cgi cgi-bin

我编写了一个cgi脚本来处理由另一个程序生成的数据。问题是该文件位于cgi-bin之外。如何确保我的perl脚本可以读取此文件?我已经尝试更改此文件的权限,我也尝试在cgi-bin文件夹中建立一个链接,但Apache太聪明了。我想可能的解决方案是:

  • 以Apache可以读取cgi-bin之外的文件的方式编辑Apache配置文件。
  • 使用“可移植”网络服务器运行cgi脚本。就像你可以用python(python -m http.server [port])。不幸的是,这不会执行perl cgi脚本。

我有点不知道如何做其中一个解决方案。

2 个答案:

答案 0 :(得分:2)

您的CGI脚本可以访问您操作系统上的任何内容,除非您在某种jail下运行apache,在这种情况下,您可以在监狱中读取任何内容。 (当然,如果apache进程有权读取文件)。

例如,下一个简单的脚本将打印出您的密码文件

use strict;
use warnings;
use CGI;

my $q=CGI->new();
print $q->header();
print qx(cat /etc/passwd);

关于现代perl web-app开发,请阅读以下内容:

从CPAN获得一些现代的web-framerowk - 这里有很多(可能太多) - 最知名的是:

我个人大多使用

修改

在您的cgi-bin中应该存在一个名为printenv.pl的脚本。尝试:

chmod 755 printenv.pl

并将浏览器指向http://address/cgi-bin/printenv.pl您将获得apache环境。请参阅,您必须了解操作系统命令的基础知识以及Web如何成功运行Web应用程序。在一个答案中写下所有内容是不可能的,你需要使用谷歌,在这里阅读其他问题的答案等。

此外,在上面的脚本中,您可以将cat /etc/passwd更改为任何其他shell命令以仅测试您的cgi脚本可以或不可以。

答案 1 :(得分:0)

我已经通过结合PSGI使用plackup解决了这个问题。

use CGI::Emulate::PSGI;
use CGI::Compile;

my $sub = CGI::Compile->compile("location/to/script.cgi");
my $app = CGI::Emulate::PSGI->handler($sub);

如果您运行plackup file.psgi,它会设置一个以当前用户身份运行的本地Web服务器。问题解决了。