TTJ #003 Una classe antispam
Transcript
TTJ #003 Una classe antispam
> TTJ #003 Una classe antispam Spesso, per evitare lo spam, si usa sostituire la @ con altre combinazioni di caratteri che non rivelano immediatamente un indirizzo di posta elettronica. Per esempio, una tecnica molto utilizzata è quella di rimpiazzare la chiocciolia con [at] e ciò permette di prevenire lo spam da parte di sistemi automatici che (90 su 100) non sono in grado di interpretare Javascript. L'idea è quindi di creare una classe che si faccia carico di individuare le email nell'HTML sostituendo la @ con [at] salvo inserire codice Javascript che rimetta le cose a posto. Tutto possibilmente senza interferire più di tanto nel codice preesistente. Supponiamo di salvare la nostra classe in myantispam.php <? class myantispam{ /** * il costruttore avvia cattura flusso output */ function __construct() { ob_start(); } /** * quando lo script non ha più handles attivi viene invocato questo metodo che * lancia sendHTML su quanto catturato */ function __destruct() { myantispam::sendHtml(ob_get_clean()); } /** * questo metodo sostituisce alle email trovate nell’html la string [at] ma * aggiunge anche all’html un javascript che ricostituisce gli [at] con @ * * @param string $html */ static function sendHtml($html='') { $html=preg_replace('/([a-z0-9\\.\\_\\%\\+\\-]+)@([a-z0-9\\.\\-]+\.(?:[az]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum))/im','\\1[at]\\2',$html); $html=str_ireplace(array('<body','</body>'), array('<body onload="myantispam()"', '<script type="text/javascript"> Zend Technologies srl Largo Richini, 6 20122 Milano Telefono: +39 02 5821 5832 Fax: +39 02 5821 5400 ©Zend Technologies, Inc. Visita il sito www.zend.com/it Pagina 1 di 2 function myantispam(){ document.body.innerHTML=document.body.innerHTML.replace(/\\[at\\]/g,"@"); document.body.innerHTML=document.body.innerHTML.replace(/%5Bat%5D/g,"@"); } </script> </body>'),$html); echo $html; } } ?> La si può usare in due modi: (1) Esplicito, si invoca il metodo sendHtml passando l’HTML da pulire <? Include(‘myantispam.php’); //non istanziare la classe Myantispam::sendHtml(’<html> <body> Script originale a <a href="mailto:[email protected]">[email protected]</a> </body> </html>‘); ?> (2) Trasparente, basta istanziare la classe all’inizio dello script e fa tutto lei <? Include(‘myantispam.php’); $antispam=new myantispam();//inizia a catturare flusso output //importante che l’oggetto si associato ad una variabile, // così quando lo script termina il distruttore invoca la sendHtml sul html catturato ?> <html> <body> Script originale a <a href="mailto:[email protected]">[email protected]</a> </body> </html> Zend Technologies srl Largo Richini, 6 20122 Milano Telefono: +39 02 5821 5832 Fax: +39 02 5821 5400 ©Zend Technologies, Inc. Visita il sito www.zend.com/it Pagina 2 di 2