我有一个我从URL访问的perl CGI脚本。我已经使用perl -wc
检查了语法,似乎没问题。但是,创建目录的命令都没有正确执行。权限设置为755
。
有谁知道如何诊断这个问题?
这是代码:
#!/usr/bin/perl
use CGI;
#-- create CGI Query
$q = CGI->new;
$prefix = "X__";
print "Content-type: text/html\n\n";
#-- get companyID
$entityID = $q->param('entityID');
#-- get directory name
$dir = "${prefix}${entityID}";
#-- change directory
chdir("/var/www/html/web/customers");
#-- create parent company directory
`sudo mkdir -m 755 $dir`;
print "${entityID}";
答案 0 :(得分:4)
您在此代码中遇到了许多最糟糕的做法。我很难看到它的一部分。有未经过处理的数据被发送到系统调用。有意特权升级。这些很有害,他们会导致你出现问题,现在 和 。
当您使用Apache跟踪问题时,要查看的内容如下所示:
返回脚本中系统调用的值。
`foo`;
对于perl 5.10及更高版本,它会为${^CHILD_ERROR_NATIVE}
返回一个值。这个价值是多少?这告诉你foo
实际返回了什么以及它是否成功。 (perldoc)
Apache错误日志。某处,有一个apache正在写入的错误日志。它可能在不同的地方,部分取决于配置。有apache虚拟服务器错误日志和apache服务器错误日志 - 这两者都可能需要查看。
出于某种原因,sudo
在这里使用( 不 是一件好事)。 sudo
有自己的日志,应该进行调查。 (Where are sudo incidents logged?)sudo可以记录很多地方(documentation),您可能需要在自己的系统上进行调查。
尽管如此,我再次恳请那些编写这样的代码的人不要首先编写这样的代码。在此代码中,有足够宽的安全孔可以驱动卡车通过。是的,它可能是一个一次性的脚本,您很快就会为客户或市场营销或不了解(您应该)在内部网上运行的人。 ..但是有一天......代码将在互联网上运行,当有人将entityId=/../../../../../../im_in_ur_root/creating_directories
传入您的参数并开始在奇怪的地方创建目录时,所有地狱都会失败。
sudo
。这是一个等待发生的问题。