Re: Нужен ли bash
On 2008.10.01 at 17:57:01 +0300, Aleksey Cheusov wrote:
> >> любом скриптовом языке. Ни в tcl ни в perl разыменование переменной не
> >> смотрит, пуста строка, или нет. И проблема, как следствие та же.
>
> > Вопрос не в том, пуста строка или нет, а в том, будет ли она передана
> > в выполняемую внешнюю команду как один параметр, или как произвольный
> > набор таковых.
> В целом я понимаю проблему, но в частностях - не вижу никакой разницы.
>
>
> 0 ~>cat ~/tmp/1.perl
> $str = "echo trtrtr; echo brbrbr";
> system("$str");
Я сказал СПИСКОВУЮ форму system.
Если там один параметр то оно вызывает shell и приехали.
Рассмотрим более реалистичный пример.
Допустим, мы ожидаем в строке имя файла и хотим его посмотреть. Для
определенности display. Злобный хакер подсовывает нам
вместо имени файла кострукцию "coolchildporn.jpg; rm -rf /".
Нет, это слишком жестоко. Пусть будет
"innocentpic.jpg; echo "Ha-Ha, you are hacked!"
Сравните результаты
$filename='innocentpic.jpg; echo "Ha-Ha, you are hacked!';
system display, $filename;
и
system "display $filename";
В первом случае получаем
display: unable to open file `innocentpic.jpg; echo "Ha-Ha, you are
hacked!"': No such file or directory.
Во втором "Ha-Ha, you are hacked!" на stdout.
> P.S. До сих пор помню стоны товарищей, которые по работе писали на
> tcl "В этом ^%$^* языке" пустые строки пропадают". Это насчет передачи
Ну, Quoting hell в Tcl - это проблема известная. Лечится одним
единственным путем. Заменой кодера на заведомо исправного. Который перед
тем как начать писать на этом языке, читает man Tcl и осознает, что
интерпретатор сделает ему ровно то, что там написано, и не более того.
Да, конечно, большая часть кодеров документацию не читают, а если
читают, то не пытаются понять и осознать, а смотрят только в примеры,
которые подгибают под свой случай напильником. В Tcl это, увы, не
работает.
Там надо соблюдать три (ну в 8.5 четыре) математически строгих правила.
--
Reply to: