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

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

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

<?php
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

Система Orphus

 


 

Comments: 3

  1. phlinten August 7th, 2009 at 11:48 pm

    полезно, спасибо.
    токо наверное логгирование можно организовать возможностями почтовика?

  2. boombick August 8th, 2009 at 5:47 pm

    Можно конечно :) Просто этот способ однозначно выделяет письма, отосланные через php-шный mail(). И он гораздо проще для “непродвинутых” пользователей

  3. tamerlan311 August 22nd, 2009 at 5:43 pm

    Мне кажется что скрипт лучше будет переписать на Bash, php интерпретатор каждый раз дёргать не кошерно….

    Хотя если письма отправляются не слишком часто , то пофигу.

Add a Comment