HTML vars to CGI скрипт (выполнение команды uix) - PullRequest
0 голосов
/ 04 апреля 2011

Работая в PERL, я пытаюсь запустить командную строку Unix, используя переменные, проанализированные из HTML-формы. Ниже приведена 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>

и я ищу правильный синтаксис, чтобы использовать эти переменные для отправки командной строки Unix через CGI-скрипт. У меня есть 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-файла. Команда unix, которую я пытаюсь выполнить в CGI, требует, чтобы и кавычки вокруг var1, и знак + before $ var2 были литеральными, что, я полагаю, потребует какого-то добавления в CGI или экранирования для правильной передачи текста. Есть ли какие-нибудь escape-переменные, которые мне нужно использовать, чтобы строка правильно выполнялась в командной строке?

Буду признателен за любую помощь, которую вы можете оказать,

Серебряный тигр

Ответы [ 2 ]

1 голос
/ 04 апреля 2011
#!/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 голосов
/ 04 апреля 2011

1) Почему бы не использовать php везде?

2) Escape-кавычки, затем используйте 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) Sidenote: всегда ставить

use warnings;
use strict;

в начале вашего Perl-скрипта. У вас будет меньше шансов пропустить ошибку.

Вы также можете добавить $parse->import_names("q");, а затем получить доступ к переменным как $q::var1 и т. Д., Что, на мой взгляд, проще, чем вызывать param() полностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...