2011-04-03 80 views
0

在PERL中工作,我想运行unix命令行使用从html表单解析的变量。以下是HTML表单:HTML变量CGI脚本(uix命令执行)

<?PHP 
if ($_REQUEST['action'] == "submit") { 
    $var1 = $_REQUEST['var1']; 
    $var2 = $_REQUEST['var2']; 
    ** working toward executing script "/usr/lib/cgi-bin/test.pl" with the above variables ** 
} 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Test HTML Submit to CGI</title> 
    </head> 
    <body> 
     <form name-"Submit" id="Submit" method="POST"> 
      <input type="hidden" name="action" value="submit" /> 
      Input Variable 1<br /><br /> 
      <input type="text" name="var1"></input><br /><br /> 
           Input Variable 2<br /><br /> 
      <input type="text" name="var2"></input><br /><br /> 
      <input type="submit" value="Execute script" /> 
         </form> 
    </body> 
</html> 

,我期待为使用这些变量通过CGI脚本提交UNIX命令行正确的语法。我有以下内容的test.pl:

use CGI; 
$parse = new CGI; 
$var1 = $parse->param('var1'); 
$var2 = $parse->param('var2'); 
if ($var1) { 
    if ($var2) { 
     echo "$var1" | UnixCommand --trigger +$var2           
    } 
} 
exit; 

我想经过一番验证Iw的病写入到PHP文件的顶部,从提交的表单执行脚本。我试图在CGI中执行的unix命令需要var1附近的引号和$ var2之前的+为正文,我认为这需要在CGI中附加某种附件或转义以使文本正确流动。我需要使用某种逃生变量来让字符串在命令行上正确执行吗?

您可以提供任何帮助,将不胜感激,

银虎

回答

0

1)为什么不使用PHP无处不在?

2)转义引号,然后用开:

# replace all quotes/backslashes 
$var2 =~ s/(['\\])/'\\$1'/g; 
# open a command (it's popen(3) really) 
open (my $pipe, "|-", "$command '$var2'") 
    or die "Cannot open $command: $!"; 
print $pipe, $var1; # not echo 

3)旁注:始终把

use warnings; 
use strict; 

在你开始perl脚本。你错过一个错误的机会就会减少。

您还可以添加$parse->import_names("q");,然后访问变量为$q::var1等IMHO更简单,比调用param()更简单。

+0

在第二个音符上,我最初试图在php中使用exec()函数来做到这一点,但无法使其工作。我很想保持这个在PHP中。之所以我让PHP调用脚本,是因为我可以在将变量提交给unix命令行之前验证并“清除”这些变量。 – Silvertiger 2011-04-03 22:16:23

+0

我删除了我的第一个评论,它是scatterbrain。我使用“echo”的原因是因为unix命令完全是这样 - echo“这是我的文本”|命令 - 选项+123456 – Silvertiger 2011-04-03 22:27:41

+0

-1:缺少污点检查;本土壳报价是错误的;不使用列表形式为popen。请阅读perlsec。 – daxim 2011-04-04 08:31:33

1
#!/usr/bin/perl -T 
use strictures; 
use CGI qw(); 
use IPC::Run qw(run); 
use autodie qw(:all run); # must come after importing 'run' 

delete @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)}; # perldoc perlsec 

my $cgi = CGI->new; 

# parameter restriction/untainting 
my ($var1) = ($cgi->param('var1') =~ /\A ([A-Za-z]+) \z/msx); 
my ($var2) = ($cgi->param('var2') =~ /\A ([A-Za-z]+) \z/msx); 

if (defined $var1 && defined $var2) { 
    run # will autodie if return code is wrong 
     ['/usr/bin/UnixCommand', '--trigger', '+'.$var2], # command and arguments as list 
     \$var1,  # in 
     \*STDOUT; # out 
} else { 
    die 'invalid parameters'; 
} 
+0

我会调整我的CGI以反映这一点,并尝试通读以了解正在完成的工作。感谢您的反馈,如果我能够取得进展,我会通知您。 – Silvertiger 2011-04-04 09:37:47

+0

它看起来像我的Ubuntu 10.10不喜欢你正在使用的项目。我安装了CPAN以查看是否可以找到并安装这些文件,但它们是否设计用于win32系统?只是试图达到我可以使用上面提供的示例的状态。 – Silvertiger 2011-04-04 10:04:43

+0

我已经安装了IPC库,并且正在通过获取此脚本来执行我的工作方式。有没有一种方法可以让我在定义输入变量的unix命令行上测试这一点,并且我能够做到这一点,因为它可能需要比默认web用户更多的权限来执行...... – Silvertiger 2011-04-04 12:54:52