Безопасное программирование на Perl
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: курсовик, антикризисное управление предприятием
| Добавил(а) на сайт: Jamzin.
Предыдущая страница реферата | 1 2 3 4 | Следующая страница реферата
Еще более хитрая возможность позволяет вам запускать внешние программы и обманывать их относительно их собственного названия. Это полезно при использовании программ, действия которых зависят от того, с использованием какого имени они запущены.
Вот синтакс:
system $настоящее_имя "ложное_имя","аргумент1","аргумент2"
Например:
$shell = "/bin/sh"
system $shell "-sh","-norc"
Этот пример запускает sh - оболочку операционной системы - с именем "-sh", заставляющим ее действовать интерактивно. Заметте, что настоящее имя программы должно храниться в виде переменной, и что между именем переменной и началом списка аргументов нет запятой.
Можно записать эту команду более компактно:
system { "/bin/sh" } "-sh","-norc"
Что такое "проверки заразности" (taint checks) в Perl? Как их включить?
Как мы видели, одна из наиболее часто встречающихся проблем с безопасностью при программировании CGI - передача оболочке ОС пользовательских переменных без их проверки. Perl предлагает механизм проверки "заразности", который не позволяет этого делать. Любая переменная, которая проинициирована данными за пределами программы (включая данные из среды, стандартного ввода и командной строки) рассматривается как "заразная", и не может быть более использована за пределами программы. Зараза может распространяться. Если вы используете зараженную переменную для присвоения значения другой переменной, вторая переменная также оказывается заражена. Зараженные переменные не могут быть использованы для вызова eval(), system(), exec() или piped open(). Если вы попытаетесь это сделать, Perl прекращает работу и выводит предупреждение. Perl также откажется работать, если вы попытаетесь вызвать внешнюю программу, не установив явно значение переменной PATH.
В версии 4 языка Perl проверка включается при использовании специальной версии интерпретатора, называющейся "taintperl":
#!/usr/local/bin/taintperl
В версии 5 - используйте флаг -T при запуске интерпретатора:
#!/usr/local/bin/perl -T
Ниже описано как "обеззараживать" (untaint) переменные.
Для более полного обсуждения вопроса можно обратиться к CGI/Perl Taint Mode FAQ (автор - Gunther Birzniek).
OK, я включил проверку заразности, как вы рекомендовали. Теперь мой скрипт прекращает работу с сообщением "Insecure $ENV{PATH} at line XX" при каждом запуске!
Даже если вы не доверяете переменной PATH при запуске внешних программ, существует возможность того, что это делает внешняя программа. Поэтому следует всегда включать такую строку в начале вашего скрипта, если вы используете taint checks:
$ENV{'PATH'} = '/bin:/usr/bin:/usr/local/bin';
Отредактируйте ее так, чтобы перечислить директории, в которых вы хотите искать. Мысль о вклюяении текущего директория (".") в состав переменной PATH является плохой идеей.
Как "обеззаразить (untaint) переменную?
После того, как переменная заражена, Perl не даст вам возможности использовать ее в функциях system(), exec(), piped open, eval(), обратных кавычках, или любой функции, которая влияет на что-либо за пределами программы (например - unlink). Вы не можете этого сделать даже если вы проверили переменную на содержание метасимволов или использовали команду tr/// или s/// для удаления метасимволов. Единственный способ обеззаразить переменную - использовать операцию поиска по маске и извлечение совпадающей подстроки. Например, если переменная должна содержать адрес электронной почты, то извлечь обеззараженную копию адреса можно следующим образом:
$mail_address=~/(w[w-.]*)@([w-.]+)/;
$untainted_address = "$1@$2";
Рекомендуем скачать другие рефераты по теме: большие рефераты, онлайн решебник.
Категории:
Предыдущая страница реферата | 1 2 3 4 | Следующая страница реферата