Ste*_*ers -4 unix perl cgi cgi-bin
我有一个从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}";
Run Code Online (Sandbox Code Playgroud)
小智 5
这段代码中有许多最坏的做法。看它的一部分让我很痛苦。有未经消毒的数据正在发送到系统调用。有故意的特权升级。这些东西很难看,现在和以后都会给您带来麻烦。
在跟踪类似于以下问题的脚本的Apache问题时要注意的事情是:
脚本中系统调用的返回值。
`foo`;
Run Code Online (Sandbox Code Playgroud)
这${^CHILD_ERROR_NATIVE}
将为Perl 5.10及更高版本返回一个值。这个值是多少?这会告诉您foo
实际返回的内容以及是否成功。(perldoc)
Apache错误日志。某个地方,有一个错误日志,Apache正在写入该错误日志。可能在不同的地方部分取决于配置。有apache虚拟服务器错误日志和apache服务器错误日志-两者都可能需要查看。
由于某种原因,sudo
在这里使用它(这不是一件好事)。 sudo
有自己的日志,应进行调查。(sudo事件记录在哪里?)sudo可以在许多地方记录(文档),您可能需要在自己的系统上进行调查。
但是,我再次恳求那些编写此类代码的人不要一开始就编写此类代码。此代码中有足够大的安全孔可以驱动卡车通过。是的,这可能是一个一次性脚本,您可能很快就向客户或市场推销该脚本,或者是一个不太了解(您应该)在Intranet上运行的人……但是有一天……该代码将在Internet上运行时,当有人entityId=/../../../../../../im_in_ur_root/creating_directories
传入您的参数并且您开始在奇怪的地方创建目录时,所有的地狱都将破灭。
sudo
在倒勾,打开或系统内使用。这是一个等待发生的问题。