Реферат: Безопасное программирование на Perl

foreach (@files) {

print if m/$user_pattern/o;

}

}

Для обхода этой проблемы программисты, пишущие на Perl, часто используют такой трюк:

foreach $user_pattern (@user_patterns) {

eval "foreach (\@files) { print if m/$user_pattern/o; }";

}

Проблема здесь состоит в том, что в операторе eval() используется пользовательская переменная. Если переменная не подвергается тщательной проверке, то можно заставить eval() выполнить произвольный код на Perl. Для понимания того, чем это грозит, подумайте, что произойдет в случае, если переменная будет иметь следующее значение: "/; system 'rm *'; /"

Проверки заразности (см. выше) позволяют поймать потенциальную опасность в этой области. Вы можете выбирать между отказом от такого рода оптимизации, или тщательным обеззараживанием переменной перед использованием. Полезная возможность в Perl5 состоит в использовании \Q и \E для комментирования метасимволов так, чтобы они не были использованы:

print if m/\Q$user_pattern\E/o;

Мой скрипт CGI требует большие привелегии, чем он получает как пользователь nobody. Как мне изменить идентификатор пользователя?

Прежде всего, действительно ли это необходимо? Предоставление больших прав увеличивает риск и позволяет взломанному скрипту нанести больше вреда. Если вы хотите предоставить скрипту права пользователя root, то сперва ОЧЕНЬ хорошо подумайте.

Вы можете заставить скрипт выполняться с правами его владельца путем установки бита s:

chmod u+s foo.pl

Вы можете предоставить ему права группы, к которой принадлежит владелец, установив бит s в поле группы:

chmod g+s foo.pl

Однако, многие системы Unix содержат лазейку, позволяющую взламывать такие скрипты. Это касается только скриптов, а не компилированных программ. В таких системах попытка запуска скрипта на Perl, для которого были выставлены s биты, приведет к появлению сообщения об ошибке со стороны самого Perl.

На таких системах вы имеете две возможности:

Можно исправить ядро так, чтобы запретить установку этих битов для файлов скриптов. Perl тем не менее будет правильно определять эти биты и устанавливать идентификатор пользователя. Подробную информацию об этом можно найти в Perl faq:

ftp://rtfm.mit.edu/pub/usenet-by-group/comp.lang.perl/

Вы можете поместить скрипт в оболочку, напмсанную на C. Обычно это выглядит так:

#include <unistd.h>

void main () {

execl("/usr/local/bin/perl","foo.pl","/local/web/cgi-bin/foo.pl",NULL);

}

После компилирования программы, выставте s биты. Программа будет выполняться с правами владельца, запускать интерпретатор Perl и выполнять скрипт, содержащийся в файле "foo.pl".

Кроме того, можно запускать сам сервер с правами пользователя, достаточными для выполнения необходимых действий. Если вы используете сервер CERN, то у вас есть возможность запускать сервер с разными правами для разных скриптов. См. документацию CERN для получения дальнейшей информации.

К-во Просмотров: 145
Бесплатно скачать Реферат: Безопасное программирование на Perl