Категория
Информатика
Тип
реферат
Страницы
6 стр.
Дата
06.07.2010
Формат файла
.rtf — Rich Text Format (Wordpad)
Архив
20605.zip — 8.06 kb
  • bezopasnoe-programmirovanie-na-perl_20605_1.rtf — 36 Kb
  • Readme_docus.me.txt — 125 Bytes
Оцените работу
Хорошо  или  Плохо


Текст работы

Безопасное программирование на Perl
Дмитрий Громов
Как избежать передачи пользовательских переменных оболочке ОС при вызове exec() и system()?
В Perl вы можете запускать внешние программы различными путями. Вы можете перехватывать вывод внешних программ, используя обратные кавычки:
$date = `/bin/date`;
Вы можете открывать "туннель" (pipe) к программе:
open (SORT, " | /usr/bin/sort | /usr/bin/uniq");
Вы можете запускать внешние программы и ждать окончания их выполнения через system():
system "/usr/bin/sort < ";
или вы можете запускать внешние программы без возврата управления с помощью exec():
exec "/usr/bin/sort < ";
Все эти выражения являются опасными если используют данные, введенные пользователем, которые могут содержать метасимволы. Для system() и exec() существует синтаксическая возможность, позволяющая запускать внешние программы напрямую, без обращения к оболочке ОС. Если вы передаете внешней программе аргументы, представляющие собой не строку, а список, то Perl не будет использовать оболочку, и метасимволы не вызовут нежелательных побочных эффектов. Например:
system "/usr/bin/sort","";
Вы можете использовать эту особенность для того, чтобы открыть туннель,
не обращаясь к оболочке ОС. Вызывая open в магической последовательности символов |-, вы запускаете копию Perl и открываете туннель (pipe) к этой копии. Дочерняя копия Perl затем немедленно запускае внешнюю программу, используя список аргументов для exec().
open (SORT,"|-") || exec "/usr/bin/sort",$uservariable;
while $line (@lines)
print SORT $line,"\n";
close SORT ;
Для чтения из туннеля без обращения к оболочке можно использовать похожий способ, с последовательностью -|:
open(GREP,"-|")



Ваше мнение



CAPTCHA