Inviare email in modo sicuro con PHP!

Giovanni Canella

10/09/2013

4271

PHP tra la sua vastissima gamma di funzionalità, ci mette a disposizione anche la possibilità di inviare mail in modo semplice e veloce! Dobbiamo però stare attenti a un fattore che non dobbiamo trascurare: la sicurezza!

Infatti se abbiamo creato un modulo di contatto all'interno del nostro sito, l'utente può inserire qualunque cosa nei campi, mettendo a repentaglio l'integralità del codice. Quindi il nostro compito, in questo articolo è quello di pulire questi dati per poi inviare l'email in modo sicuro.

Questo tipo di attacco prende il nome di Email Injection, dove un hacker potrebbe usufruire del nostro form per inviare spam a nostra insaputa a terzi.

Inviare email in modo sicuro con PHP!

 

Esempio di attacco

Prendiamo in considerazione un esempio banale di invio di una mail in base ai dati passati da un form (da non utilizzare, mostrato solo per capire il meccanismo di attacco).

form.php

<form method="post" action="#" id="contattami">
	<h1>Contattami!</h1>
	<label for="nome">Nome:<br/>
	<input type="text" name="Nome" id="nome"/>
	
	<label for="cognome">Cognome:</label><br />
	<input type="text" name="Cognome" id="cognome"/>
	
	<label for="email">Email:</label><br />
	<input type="text" name="Email" id="email"/>
	
	<label for="oggetto">Oggetto:</label><br />
	<input type="text" name="Oggetto" id="oggetto"/>
	
	<label for="messaggio">Messaggio:</label><br />
	<textarea name="messaggio" id="messaggio"></textarea>
    
	<input type="submit" name="Invia" value="Invia" id="invia" />
</form>

 

E il relativo codice php:

if(isset($_POST["invia"])) {
	if(mail("mia.email@ginho.it", $_POST["oggetto"], $_POST["messaggio"], "From: " . $_POST["email"] . "\n\r Reply-To: mia.email@ginho.it \r\n")) {
		echo "Email inviata con successo! :D";
	} else {
		echo "Errore durante l'invio della mail! :(";
	}
} else {
	require("form.php");
}

In questo modo viene inviata un email con oggetto $_POST["oggetto"], messaggio $_POST["messaggio"] dall'indirizzo $_POST["email"] a quello nostro di amministratore (es. mia.email@ginho.it).

Fino quà sembra tutto lecito, ma quando proviamo a "far leva" sul campo email inserendo nel form un qualunque indirizzo seguito dal carattere codificato "%0A", che altro non è che uno spazio, e l'intestazione che vogliamo "iniettare", per esempio :

  • Subject: (oggetto),
  • Bcc: (Blind Carbon Copy) Invia l'email a più destinatari senza mostrarli nell'instestazione della mail.

Ed è proprio la seconda che ci preoccupa perchè in questo modo l'email sarà inoltrata a tutti gli indirizzi email che aggiungeremo di seguito senza essere visualizzati nelle intestazioni, inviando spam indesiderato da un indirizzo email anonimo!

Ecco un esempio del campo email:

 

mia.email@ginho.it%0ABcc:altra.mail@gmail.com%0ABcc:altra.mail.spam@gmail.com

 

E di come saranno le nuove intestazioni della mail:

 

Subject: Cocco beloo! Freschissimo!

From: anonymouse@anonymous.com

Bcc: altra.mail@gmail.com, altra.mail.spam@gmail.com

Coco beloo!

 

Soluzione del problema

Per risolvere questo problema basta purificare i campi della email, grazie alla funzione filter_var(), passando come parametro FILTER_SANITIZE_EMAIL. Ecco un esempio:

$email = filter_var($_POST["email"], FILTER_SANITIZE_EMAIL);

E per verificare se l'email è valida, passiamo come parametro FILTER_VALIDATE_EMAIL.

$risultato = filter_var($email, FILTER_VALIDATE_EMAIL);

if($risultato == TRUE) {
	echo "L'email inserita è valida!";
} else {
	echo "L'email inserita non risulta valida!";
}

In questo modo la nostra applicazione sarà al sicuro da questo tipo di attacchi!

if(isset($_POST["invia"])) {
	$email = filter_var($_POST["email"], FILTER_SANITIZE_EMAIL);
	
	if(filter_var($email, FILTER_VALIDATE_EMAIL)) {
		if(mail("mia.email@ginho.it", $_POST["oggetto"], $_POST["messaggio"], "From: " . $_POST["email"] . "\n\r Reply-To: mia.email@ginho.it \r\n")) {
			echo "Email inviata con successo! :D";
		} else {
			echo "Errore durante l'invio della mail! :(";
		}
	} else {
		echo "Email non valida ;)";
	}
} else {
	require("form.php");
}

 

I più letti

Ti potrebbero interessare