Если у вас свой сервер (или хостинг-сервер), на котором расположено множество различных проектов, то, возможно, вы сталкивались со следующей проблемой: из-за уязвимости в скрипте на один из проектов попал вредоносный код, занимающийся рассылкой спама. Найти виновника порой бывает весьма проблематично. Так что оптимальным выходом будет просто логировать действия функции mail()
Все крайне просто
Создайте файл /usr/local/bin/phpsendmail
и поместите в него следующий код:
/**
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.formchown 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
0 коммент.:
Отправить комментарий