Wrapper Sendmail
Problema del giorno… quante volte capita che qualche script non sicuro (es. form php senza controlli di sicurezza sull’inserimento dei dati e conseguente invio di un’email), riempia le code dei nostri server di posta? A me sinceramente molto spesso (si pensi a qualcuno che crea uno script di “test” che basta lanciarlo e viene spedita un’email, lo script viene dimenticato li e trovato da qualche bontempone che si diverte a esguirlo centinaia di volte… voi direte “ma chi vuoi che lo faccia?!?!?!?” e io vi rispondo dicendo solo… “più di quanti si possa immaginare”).
Conseguenza di tutto questo sono ore perse a cercare qualche script, sito o altro responsabile del fattaccio, con conseguenti improperi verso ogni genere di essere vivente vi si presenti vicino.
Grazie ai consigli e all’aiuto di Marco Londero, abbiamo ideato un piccolo wrapper php che genera un log sulla posta che viene inviata trmamite il comando mail() di php, e aggiunge un header all’interno dell’email stessa in grado di permetterci di risalire al log desiderato e riuscire ad identificare meglio l’origine di un certo problema.
All’interno di tale log avremo una cosa molto importante, il path dello script che ha generato e inviato l’email in questione.
Siamo partiti a partire un wrapper trovato su groogsblog e tramite semplici modifiche siamo riusciti ad ottenere quel che ci serviva.
Una definizione di wrapper (giusto per capire di cosa si parla) potrebbe essere la seguente “Un wrapper è uno script di shell che incorpora una utility o un comando di sistema. Questo evita di dover digitare una serie di parametri che andrebbero passati manualmente a quel comando.”
Vediamo ora come installarlo.
Presupponiamo di utilizzare postfix (di fatto si potrebbe usare qualunqua altro sistema senza problemi),
cd /etc/postfix/
touch sendmail.php
chmod 775 sendmail.php
nano sendmail.php
A questo punto nel file sendmail.php inseriamo il codice del Wrapper, e salviamo il file.
Modifichiamo olra il file php.ini e permettiamo al wrapper di essere eseguito prima di sendmail (sarà il wrapper stesso dal suo interno a richiamare sendmail al momento opportuno).
nano /etc/php.ini
sostituiamo il valore di sendmail_path con il seguente
sendmail_path = /etc/postfix/sendmail.php
Prepariamo le directory che conterranno i log che che genererà il nostro simpatico wrapper
mkdir /var/log/phpmail
chown root:apache /var/log/phpmail
chmod 770 /var/log/phpmail
ed ora non ci resta altro che riavviare apache
/etc/init.d/apache2 restart
Date una controllata al file /var/log/httpd/error_log per vedere che sia tutto corretto e aspettate (o create uno script in php per testarlo), ora quando verrà inviata un’email da uno script in php accadranno due cose
1- nell’header dell’email vi sarà un campo nuovo che si chiama X-MsgID e che altro non è che il nome del file in /var/log/phpmail/ che contiene i dati dell’email inviata dal webserver
2- all’interno del file relativo all’header X-MsgID vi sarà un campo che indicherà il path dello script che ha inviato un’email
Riporto di seguito un esempio del contenuto del file di log di un’email
Body: 574 bytesDate: Fri, 23 Nov 2007 16:35:37 +0100
PWD: /var/www/vhost/XXX.TLD/home/html/phpBB2
Msg ID: ns3.eastitaly.it_20071123163537.4746f3495849d
Message:
———-
To: tusysweelszew@mail.ru
Subject: Welcome to www.XXX.TLD Forums
Reply-to: info@XXX.TLD
From: info@XXX.TLD
Return-Path: info@XXX.TLD
Message-ID: <aace212218a818186b114bcd1fe00573@www.XXX.TLD>
MIME-Version: 1.0
Content-type: text/plain; charset=iso-8859-1
Content-transfer-encoding: 8bit
Date: Fri, 23 Nov 2007 16:35:37 +0100
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: PHP
X-MimeOLE: Produced By phpBB2
X-MsgID: ns3.eastitaly.it_20071123163537.4746f3495849d
———-
Body: 574 bytes
Da questo log oltre a tutti i dati tipici di un’email si può notare la riga
PWD: /var/www/vhost/XXX.TLD/home/html/phpBB2
che non è altro che il path dello script che ha inviato l’email, chiaramente sarebbe più efficiente se vi fosse la possibilità di identificare direttamente il nome dello script, ma diciamo che già così gran parte dei problemi si riescono a isolare e identificare in breve tempo.
Un altra eventuali miglioria che si può apportare è di gestire tutto questo anzichè come file separati come un unico file di log, ma lo faremo col tempo e con la voglia come sempre
Saluti
![Validate my CSS [Valid CSS]](wp-content/themes/silver-lexus-08/images/vcss.gif)
![Validate my RSS feed [Valid RSS]](wp-content/themes/silver-lexus-08/images/valid-rss.png)