1. ovvero: “ piccole regole di hardening per le contact form dei nostri blog” a cura di Francesco Fullone < [email_address] > un phpBreakfast offerto dal GrUSP ed Apropos Il tuo sito? Il mio spam relay!
2.
3.
4. Prima di iniziare un pochino di ripasso Il flusso dell'informazione all'interno di un'applicazione php avviene normalmente in un modo: INPUT ELABORAZIONE OUTPUT che può essere di qualsiasi tipo html, css, javascript, sql, xml o anche php! che può essere di qualsiasi tipo da form su web a dati provenienti da un db, ad interrogazione di un webservice
5. Non credere agli utenti, filtra l’INPUT! Utilizzare i dati di input così come vengono inviati (raw data) è pericoloso… BISOGNA FILTRARE! Ma di questo ne abbiamo parlato lo scorso anno... ricordate?
6. Mail Injection Il Mail Injection è una tecnica che permette di inoculare all'interno di semplici script di invio email codice per sfruttare il web server come spam relay. Sfruttando l'input non filtrato è possibile aggiungere nuovi elementi alla nostra email, come ad esempio altri indirizzi email. Vedremo ora un esempio classico di form di invio contatti presente nel 90% dei blog/siti su internet
10. I DATI NON SONO STATI FILTRATI... QUESTO COMPORTERA' SPAM!!!
11. Dati non filtrati? Ahi, Ahi, Ahi... Supponiamo di inviare tramite form: $_POST['email'] = "sender@real.tlc> %0A Cc:pr0n@sex.xxx %0A Bcc:spam@grrrr.xxx,v1agr4@pills.xxx <v1agr4@pills.xxx" <?php if ($_POST['spamma'] == “send”) { mail( 'spam-me@fullo.net', 'ti ho mandato un messaggio!', $_POST['messaggio'], “ From: $_POST['nome'] $_POST['cognome'] < $_POST['email'] >”); } ?> Che si traduce in una email così scritta: To: spam-me@fullo.net Subject: ti ho mandato un messaggio! From: $_POST['nome'] $_POST['cognome'] < sender@real.tlc> Cc:pr0n@sex.xxx Bcc:spam@grrrr.xxx,v1agr4@pills.xxx <v1agr4@pills.xxx > $_POST['messaggio']
12. Una semplice cura... Così come ho fatto per gli indirizzi email potrei iniettare un nuovo subject, un body o un mime type ! Come fare per proteggersi? Semplice, filtrando l'input! <?php $from = urldecode($from); if (eregi("",$from) || eregi("",$from)){ die("ti ho beccato spammer!"); } ?> E verificando l'esistenza del dominio dell'email Con Linux è possibile utilizzare la funzione checkdnsrr che permette di interrogare host e servizi remoti, maggiori informazioni sul manuale online di php: http://us3.php.net/manual/it/function.checkdnsrr.php
13. Una cura più efficace Usare librerie come PEAR:MAIL, Zend_Mail o gli eZ components risolve molti problemi Alcune librerie permettono infatti di fare controlli avanzati sul tipo di dato parsando non solo i “ caratteri cattivi ” ma controllando anche che le email inserite siano corrette controllandone il contenuto o addirittura interrogando direttamente i server smtp remoti per sapere se l'account esiste
14. Una protezione in più non si rifiuta mai... Usare AKISMET per ricontrollare i dati (già parsati) aiuta a ridurre anche lo SPAM in ingresso. AKISMET.com è un servizio gratuito offerto dai creatori di WordPress.com per filtrare i messaggi e controllare che non contengano spam. Il progetto mette a disposizioni delle API liberamente utilizzabili per integrare il tutto all'interno della propria applicazione. In un anno di utilizzo ho bloccato circa 100.000 messaggi di spam (molti dei quali inviati con tecniche di mail injection)
17. Contatti Francesco Fullone [email_address] ffullone http://www.fullo.net http://www.grusp.it http://www.aproposito.org
18. Licenza Quest'opera è stata rilasciata sotto la licenza Creative Commons Attribution-ShareAlike 2.5. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/publicdomain/ o spedisci una lettera a Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.