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