CGI脚本无法创建目录

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在倒勾,打开或系统内使用。这是一个等待发生的问题。
  • 不要使用perl提供的函数调用来创建目录。
  • 请在目录上正确设置权限,以使Web服务器可以写入其应具有的权限而无需特权升级。