2014-09-24 241 views
-4

我有一个perl CGI脚本,我从一个URL访问。我使用perl -wc检查了语法,它似乎没问题。但是,没有任何创建目录的命令正确执行。该权限设置为755CGI脚本不会创建目录

有没有人知道如何去诊断这个问题?

这是代码:

#!/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}"; 

回答

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服务器可以写入应该能够访问的内容,而不需要特权升级。
+0

原来我的perl版本是很老:Perl版本:5.016003 – 2014-09-24 21:04:13

+0

而返回的值是256,从$ {^ CHILD_ERROR_NATIVE} – 2014-09-24 21:06:13

+0

Perl的返回值乘以256须藤返回1([手册页](HTTP ://www.sudo.ws/sudo.man.html))表示“否则,如果存在配置/权限问题或者sudo无法执行给定命令,则sudo的值将为1。” – 2014-09-24 21:08:10