【问题标题】:HTML vars to CGI script (uix command execution)HTML vars 到 CGI 脚本(uix 命令执行)
【发布时间】:2011-07-28 19:09:18
【问题描述】:

在 PERL 中工作,我正在尝试使用从 html 表单解析的变量来运行 unix 命令行。以下是 HTML 表单:

<?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;

我只想在一些验证之后从提交的表单执行脚本我将写入 PHP 文件的顶部。我试图在 CGI 中执行的 unix 命令要求 var1 周围的引号和 $var2 之前的 + 都是文字,我认为这需要在 CGI 中进行某种附加或转义以使文本正确流动。我需要使用某种转义变量来让字符串在命令行中正确执行吗?

如果您能提供任何帮助,我们将不胜感激,

银虎

【问题讨论】:

    标签: php perl unix cgi


    【解决方案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';
    }
    

    【讨论】:

    • 我将调整我的 CGI 以反映这一点,并尝试通读以了解正在执行的操作。感谢您的反馈,如果我能够取得进展,我会通知您。
    • 看起来我的 ubuntu 10.10 不喜欢你正在使用的项目。我安装了 CPAN 以查看是否可以找到并安装这些,但它们是否设计用于 win32 系统?只是想达到可以使用上面提供的示例的状态。
    • 我已经安装了 IPC 库,目前正在努力让这个脚本执行。有没有办法让我在定义输入变量的 unix 命令行中对此进行测试,我是否可以 sudo 执行此操作,因为它可能需要比默认 Web 用户更多的权限才能执行...
    • 的确,这在罚款CGI manual中有解释。
    • 感谢您提供的信息,我将处理此问题并在准备好后发布我的最终结果。
    【解决方案2】:

    1) 为什么不到处使用php?

    2) 转义引号,然后使用 open:

    # 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-&gt;import_names("q");,然后以$q::var1 等方式访问变量,恕我直言,这比一直调用param() 更简单。

    【讨论】:

    • 在第二个注意事项上,我最初试图使用 php 中的 exec() 函数来执行此操作,但无法使其正常工作。我很想把它保存在 php.ini 中。我让 PHP 调用脚本的原因是我可以在将变量提交到 unix 命令行之前验证和“清理”变量。
    • 我删除了我的第一条评论,那是 scatterbrain。我使用“echo”的原因是因为unix命令完全是这样的——echo“这是我的文本”|命令 --options +123456
    • -1:缺少污点检查;本土壳牌报价是错误的; popen 不使用列表形式。请阅读 perlsec。
    • @daxim:感谢列表打开表单,我忽略了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 2012-02-16
    相关资源
    最近更新 更多