LINUX.ORG.RU

как запретить использовать bash в аргументах программы?

 


0

1

привет.

есть некоторый web-сервис, на странице которого юзеры вводят данные и нажимают «выполнить». введенные аргументы подставляются некоторой программе, которая на основании введенных данных формирует другие данные и отображает их юзеру. т.е. запуск происходит так: program args...

проблема в том, что некоторые юзеры догадались, что что в качестве аргументов они могут указывать bash-инструкции, что предоставляет лазейку злоумышленникам.

вопрос всего один: каким образом запретить сей беспредел?

почитав 'man bash', так и не смог выявить какую-то закономерность, которую я могу попытаться детектировать путем разбора аргументов указываемых юзером.

подскажите, как быть?

благодарен.

★★★

Последнее исправление: niXman (всего исправлений: 1)

Ответ на: комментарий от MikeDM

парсить запрос на валидность.

это практически невозможно. аргументы передаваемые программе могут быть любой последовательность символов/слов.

PHP что ле?

ага.

niXman ★★★
() автор топика

проблема в том, что некоторые юзеры догадались, что что в качестве аргументов они могут указывать bash-инструкции

Ай, какие нехорошие люди! Вот всё им нужно испортить! Делать всё то, что люди делают для предотвращения sql и прочих инъекций — писать валидаторы, экранировать вход.

helios ★★★★★
()
Ответ на: комментарий от PolarFox

Нельзя запустить программу без помощи шелла?

во-первых - я не знаю как это сделать. во-вторых - php функция которая используется - proc_open()[1], она выполняет переданную ей команду как: /bin/sh program args...

[1] http://de1.php.net/proc_open

niXman ★★★
() автор топика

А вообще, проблема не в bash, а в том, что у юзера есть доступ до аргументов программы. Нельзя что ли было сделать более высокоуровневый интерфейс?

Black_Shadow ★★★★★
()

Заставьте PHP не запускать шелл с командой на входе, а делать fork() + execve(«/path/to/program»,«argument»,«argument...»).

AITap ★★★★★
()
Ответ на: комментарий от niXman

во-первых - я не знаю как это сделать

А еще ты не умеешь гуглить.

Раз:

NOTE: If you are using PHP >= 4.2 you should use the pcntl_* (Process
Control) functions instead of this hack.

PHP, before version 4.2, didn't provide any execl(3)-like or
execv(3)-like methods to invoke external programs, thus everything
goes trough /bin/sh -c and we are forced to quote arguments.

To make it worse escapeshellarg() behaves badly (IMHO) with an empty
string:
<?php
    echo "mime-construct --to ".escapeshellarg($to)." --cc a@a.com";
?>

The following function is a wrapper to system(), and it can be adapted
to popen(),exec(),shell_exec():

<?php
    # system with perl? semantics
    function lib_system() {
        $arg=func_get_args();
        if(is_array($arg[0]))
            $arg=$arg[0];
        $cmd=array_shift($arg);
        foreach($arg as $i) {
            $cmd.=" ''".escapeshellarg($i);;
        }
        system($cmd);
    }
    # example1
    lib_system("mime-construct","--output", "--to",$a,"--string",$b);
    # example2
    lib_system(array("mime-construct","--output", "--to",$a,"--string",$b));
?>

Два: http://www.php.net/manual/ru/ref.pcntl.php

P.S. На пхп не пишу. Потратил ровно минуту на поиск в гугле.

geekless ★★
()
Ответ на: комментарий от Black_Shadow

экранировать, это перед каждым таким символом добавлять косую? так а аргументы программы в этом случае не «пострадают»?

niXman ★★★
() автор топика
Ответ на: комментарий от geekless

А еще ты не умеешь гуглить.

спасибо большое. но для того чтоб что-то нагуглить, нужно понимать как/какой запрос использовать.

niXman ★★★
() автор топика
Ответ на: комментарий от geekless

спасибо еще раз. читаю, думаю...

niXman ★★★
() автор топика
Ответ на: комментарий от niXman

экранировать, это перед каждым таким символом добавлять косую? так а аргументы программы в этом случае не «пострадают»?

Тебе выше подсказали гораздо более правильный способ.

Black_Shadow ★★★★★
()
Ответ на: комментарий от geekless

в общем таки реализовал с использованием escapeshellarg().

скажите, такую защиту можно обойти каким-то образом?

niXman ★★★
() автор топика

Прикольный у вас там программист. С чувством юмора.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от niXman

Up.

скажите, такую защиту можно обойти каким-то образом?

niXman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.