Muchos spammers se aprovechan de formularios de envío de correo en la Web para enviar de forma indiscriminada correo. PHP no guarda registro de la actividad de su función
mail() así que poco sabemos si un
spammer está usando alguna web alojada en nuestro servidor web para enviar
spam. A modo de prueba modifiqué el código fuente de la última versión a la fecha de PHP, la versión 5.2.6, para que guarde registro de todos los correos que se envian usando PHP, información como puede ser a quién va dirigido el correo, las cabeceras del correo, el PID del proceso que envió el correo o información sensible como el asunto o el cuerpo del correo. Los campos a mostrar se pueden modificar a nuestras necesidades, pero sirva como ejemplo lo siguiente:
— php-5.2.6/ext/standard/mail.c 2007-12-31 08:20:12.000000000 +0100 +++ php-5.2.6.mod/ext/standard/mail.c 2008-11-20 18:01:00.000000000 +0100 @@ -96,6 +96,7 @@ char *force_extra_parameters = INI_STR(«mail.force_extra_parameters»); char *to_r, *subject_r; char *p, *e; + FILE * logfile; if (PG(safe_mode) && (ZEND_NUM_ARGS() == 5)) { php_error_docref(NULL TSRMLS_CC, E_WARNING, «SAFE MODE Restriction in effect. The fifth parameter is disabled in SAFE MODE»); @@ -171,6 +172,16 @@ } if (php_mail(to_r, subject_r, message, headers, extra_cmd TSRMLS_CC)) { + // mail() logging: + logfile= fopen(«/tmp/php_mail.log»,»a»); + fprintf(logfile, «\nNew mail:\n»); + fprintf(logfile, «PID: %d\tPPID: %d\n», getpid(), getppid()); + fprintf(logfile, «Script filename: %s\n», getenv(«SCRIPT_FILENAME»)); + fprintf(logfile, «Remote IP: %s\n», getenv(«REMOTE_ADDR»)); + fprintf(logfile, «Server name: %s\n», getenv(«SERVER_NAME»)); + fprintf(logfile, «To: %s\nSubject: %s\nHeaders: %s\nMessage: %s\n», + to_r, subject_r, headers, message); + fclose(logfile); RETVAL_TRUE; } else { RETVAL_FALSE;
Podemos extraer la dirección de correo del remitente, de las cabeceras, en concreto del campo From:. Para guardar sólo el remitente, el destinatario y la hora de envío del correo y no vulnerar la privacidad de los usuarios aunque el ejemplo arriba dado es únicamente un ejemplo, no una recomendación de uso.
0 comentarios