di: Andrea Cristaudo 20 Aprile 2006
Anche l’introduzione dei formmail sul web risale agli albori ed è tutt’ora molto utilizzato soprattutto nei siti web istituzionali di società. In origine esisteva uno script sviluppato in Perl (il formmail.pl appunto) utilizzato in lungo ed in largo, in seguito furono sviluppati script analoghi in vari linguaggi. Su hotscripts.com nella sezione php si contano più di 200 script di questo tipo. La ragione di questa segmentazione è individuabile nella facilità con cui in php si può sviluppare un formmail: si tratta essenzialmente di un form in cui si permette all’utente di immetere qualche dato e una manciata di codice per raccogliere questi input ed passarli alla funzione mail.
Arriviamo in questo modo alla prima soglia di sicurezza da considerare: la scelta della libertà da lasciare all’utente. Una mail infatti è essenzialmente composta da due parti principali: il destinatario e il contenuto del messaggio. Nel nostro formmail dovremmo permettere all’utente di sceglierne solo uno, non entrambi. In questo modo si riesce a bloccare lo spammer più evidente, quello cioè che usa il nostro formmail per inviare la mail che vuole a chi vuole.
Evitato questo pericolo possiamo passare ad analizzare il rischio che si nasconde nei formmail e cioè la mail-injection. La funzione mail del php non si occupa di fare un parsing dei parametri passati e si limita ad assemblare il messaggio con i dati che possiede. Questo permette ad un utente malizioso di utilizzare il vostro form per inviare spam cercando di sostituire il testo della vostra mail con le proprie intestazioni (quindi anche i destinatari) e con il proprio messaggio.
Così ad esempio una mail formattata dalla funzione php come
HEADER VARI
From: Mittente
Subject: Titolo
Testo del messaggio
.
viene trasformata in un messaggio malizioso del tipo
HEADER VARI
From: Mittente
Subject: Titolo fittizio\r\n
Bcc: prima@mail.it; seconda@mail.it; terza@mail.it
Testo del messaggio legittimo.
.
per decidere i destinatari della mail oppure in questa per scegliere il testo da mostrare al destinatario!
HEADER VARI
From: Mittente
Subject: Titolo fittizio\r\n
Content-Type: multipart/mixed; boundary=lucertola;\r\n
--lucertola\r\n
Content-Type: text/html\r\n
\r\n
Messaggio di spam.\r\n
--lucertola--\r\n
Testo del messaggio legittimo.
.
È evidente come questa falla abbinata ad uno spambot consista in una manna dal cielo per chi vuole inviare messaggi non richiesti senza essere rintracciato e al tempo stesso vi esponga al rischio di essere inseriti in una blacklist di spammer senza aver inviato un solo messaggio non richiesto.
Dobbiamo trovare un modo di filtrare gli utilizzi leciti del nostro formmail; fortunatamente le soluzioni sono molteplici e semplici da applicare.
La funzione mail del php presenta un quarto parametro opzionale con il quale è possibile passare degli header aggiuntivi personalizzati. Questi header vengono aggiunti in coda a quelli già impostati esattamente come sono passati alla funzione: l’interprete php non si occupa di inserire i caratteri di rientro e di nuova linea. Da un lato questa caratteristica ci consente una maggior flessibilità nell’utilizzo della funzione, ma dall’altro ci espone proprio al rischio evidenziato prima.
Un rimedio rapido consiste nell’aggiungere alla
stringa che
contiene i nostri header personalizzati la sequenza
“\r\n\r\n” che crea una linea vuota che nel formato
delle
email significa il passaggio dagli header al contenuto vero e proprio
della mail.
mail('mail@destinatario.it', 'Oggetto', 'Testo', 'Header aggiuntivi'.<strong>"\r\n\r\n"</strong>);
Questa soluzione è efficace solamente per i tentativi di mail-injection tentati sul contenuto della mail. Purtroppo infatti non ri rivela funzionale per i tentativi di utilizzo illecito di campi header come il campo del mittente (molto spesso specificato) o come il soggetto.
Una soluzione più efficace consiste nell’evitare l’invio di tutti i messaggi che comprendono al loro interno la stringa “\n” o “\r” in modo da bloccare sul nascere il tentativo di spam.
Invece di utilizzare direttamente la funzione mail che effettua il pacchettamento ed invio della mail “as it is” è possibile mediare la spedizione di un messaggio con una classe studiata ad hoc. In questo modo sarà molto più semplice applicare eventuali filtri aggiuntivi a tutta la posta inviata dal vostro sito web. È possibile così mettere in pratica le due soluzioni suggerite in precedenza modificando un singolo file. In alternativa è possibile utilizzare una classe già diffusa come ad esempio phpmailer.
Già che siamo in argomento vorrei segnalare come evitare che i messaggi email legittimamente inviati dal vostro server tramite php vengano riconosciuti come spam (questo avviene regolarmente con grossi provider come ad esempio Libero.it). La soluzione, anche in questo caso semplice, consiste nello specificare nel quinto parametro della funzione mail (disponibile dalla versione 4.0.5) la stringa “-fmittente” ad esempio “-fchris@html.it”. Il quinto parametro della funzione mail permette di specificare parametri da passare al server smtp presente sulla macchina insieme al messaggio da inviare, quindi controllate accuratamente il contenuto di eventuali parametri passati provenienti dall’esterno. Da notare con attenzione che in caso di safe mode non sarà possibile specificare il quinto parametro e verrà generato un errore.
Guida Yii FrameworkCome creare applicazioni Web in modo semplice e veloce con il... |
Guida Zend FrameworkDiventate professionisti dello sviluppo Web. Zend Framework è lo... |
Guida Applicazioni Facebook con PHPCome realizzare un'applicazione per Facebook. Dalle basi della... |
Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.
Iscriviti alla newsletter
|
|
Corso PHP per Webmaster11 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base25 Giugno 2012 a Milano |
|
|
Corso Google AdWords Base05 Giugno 2012 a Roma |