Логирование писем, отосланных через функцию mail()

воскресенье, 9 августа 2009 г.

Если у вас свой сервер (или хостинг-сервер), на котором расположено множество различных проектов, то, возможно, вы сталкивались со следующей проблемой: из-за уязвимости в скрипте на один из проектов попал вредоносный код, занимающийся рассылкой спама. Найти виновника порой бывает весьма проблематично. Так что оптимальным выходом будет просто логировать действия функции mail()

Все крайне просто
Создайте файл /usr/local/bin/phpsendmail и поместите в него следующий код:

#!/usr/bin/php
/**
This script is a sendmail wrapper for php to log calls of the php mail() function.
Author: Till Brehm, www.ispconfig.org
*/
$sendmail_bin = '/usr/sbin/sendmail';
$logfile = '/var/log/mail.form';
//* Get the email content
$logline = '';
while ($line = fgets(STDIN)) {
if(stristr($line,'to:') || stristr($line,'from:')) $logline .= trim($line).' ';
$mail .= $line;
}

//* compose the sendmail command
$command = 'echo "'.$mail.'" | '.$sendmail_bin.' ';
for ($i = 1; $i < $_SERVER['argc']; $i++) {
$command .= $_SERVER['argv'][$i].' ';
}

//* rotate log if it gets too big
if(is_file($logfile) && filesize($logfile) > 10000000) {
if(is_file($logfile.'.old')) unlink($logfile.'.old');
exec('cp -pf '.$logfile.' '.$logfile.'.old');
exec('cat /dev/null > '.$logfile);
}

//* Write the log
system('echo "'.date("Y-m-d H:i:s").' '.$_ENV['PWD'].' '.$logline.'" >> '.$logfile);

//* Execute the command
return shell_exec($cmd);


Это логгер всех сообщений с ротированием лог-файла.
Не забудьте указать верный путь к sendmail в переменной $sendmail_bin

Затем сделайте скрипт исполняемым

chmod +x /usr/local/bin/phpsendmail

Создайте лог-файл, смените владельца на пользователя, от которого запускается веб-сервер и дайте ему права на запись

touch /var/log/mail.form
chown www-data:www-data /var/log/mail.form
chmod 0700 /var/log/mail.form

Приведите ваш конфигурационный файл php.ini к следующему виду (измените параметр sendmail_path)

[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = /usr/local/bin/phpsendmail

И перезапустите веб-сервер

/etc/init.d/apache2 restart

Проверить логгер можно с помощью нехитрого скрипта:

mail('yourname@yourdomain.com','This is a test message subject','This is a test message body');
echo 'Mail sent.';


Запустите этот сценарий через web и проверьте лог:cat /var/log/mail.form

Оригинал: http://howtoforge.org/how-to-log-emails-sent-with-phps-mail-function-to-detect-form-spam

0 коммент.:

Отправить комментарий