PHP  »  Articoli  »  Sicurezza di Php 

Proteggere i propri siti dagli spambot delle mail

di: Andrea Cristaudo     20 Aprile 2006

I formmail: il problema

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.

I formmail: la soluzione

Dobbiamo trovare un modo di filtrare gli utilizzi leciti del nostro formmail; fortunatamente le soluzioni sono molteplici e semplici da applicare.

Modificare il quarto parametro della funzione mail

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.

Filtrare i messaggi che tentano di inserire un carattere di nuova linea

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.

Utilizzare in alternativa alla funzione mail una classe

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.

Guide PHP

Guida Yii Framework

Come creare applicazioni Web in modo semplice e veloce con il...

Guida Zend Framework

Diventate professionisti dello sviluppo Web. Zend Framework è lo...

Guida Applicazioni Facebook con PHP

Come realizzare un'applicazione per Facebook. Dalle basi della...

Altre guide

Newsletter @PHP

Ogni lunedì, direttamente nella tua e-mail: script, articoli, guide e tutorial su PHP, MySQL e Apache.

Iscriviti alla newsletter

Altre newsletter

Corsi in aula

Corso PHP per Webmaster

11 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

25 Giugno 2012 a Milano
Disponibilità: 7 Posti

Corso Google AdWords Base

05 Giugno 2012 a Roma
Disponibilità: 7 Posti