CGI脚本不会创建目录

时间:2014-09-24 19:56:19

标签: perl unix 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}";

1 个答案:

答案 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。这是一个等待发生的问题。
  • 使用perl提供的函数调用来创建目录。
  • 正确设置目录的权限,以便Web服务器可以写入应该能够执行的权限而无需权限提升。