Offuscare le email: lo shortcode per WordPress

Proteggere gli indirizzi email in WordPress offuscandoli agli spambot tramite l’uso di shortcode.

WordPress ha una funzione poco nota, messa alcuni giorni fa in evidenza da WP Recipes e poi ripresa da Panese. La funzione si chiama antispambot e serve ad offuscare gli indirizzi email ai crawler finalizzati allo spam.

Vorrei spendere, però, qualche parola in più sul suo funzionamento.

La funzione di WordPress

La funzione va usata direttamente nei template o nei plugin in questo modo:

antispambot( $emailaddy, $mailto );

dove $emailaddy è l’indirizzo email e $mailto serve a indicare a WordPress se deve offuscare l’indirizzo (1) o no (0). Per capire meglio la variabile $mailto, osserviamo queste due righe di PHP:

echo antispambot( 'nomeutente@example.com', 0 ) . '<br />' . "\n";
echo antispambot( 'nomeutente@example.com', 1 );

Se le eseguiamo, ecco cosa ci fa vedere il browser:

nomeutente@example.com
%6e%6f%6de%75%74en%74e@e%78am%70l%65.com 

ed ecco cosa c’è nel sorgente HTML (fare clic per ingrandire):

Quindi entrambe le righe vengono offuscate nel sorgente, ma la prima riga — dove abbiamo usato 0 — è mostrata in chiaro nella pagina renderizzata dal browser.

L’offuscamento, poi — oltre ad operare solo in alcune lettere dell’indirizzo — è del tutto casuale. Se si prova a ricaricare la pagina, esso cambia continuamente, ad esempio: nomeute%6ete%40exam%70l%65.com
oppure %6e%6fm%65ut%65n%74e@ex%61mple.%63%6fm
oppure no%6d%65ute%6e%74%65@%65x%61mp%6ce.co%6d.

Avendo presente questo, si deduce che la variabile $mailto = 1 va usata come indirizzo per href, mentre $mailto = 0 va usata se si vuole far visualizzare in chiaro l’indirizzo (che sarà offuscato comunque nel sorgente). Ecco un esempio d’uso concreto:

echo '<a href="mailto:' . antispambot( 'nomeutente@example.com', 1 ) . '">' . antispambot( 'nomeutente@example.com', 0 ) . '</a>';

che genera questo nel sorgente (fare clic per ingrandire):

mentre nel browser vedremmo normalmente l’indirizzo email col suo link.

Il risultato finale, come abbiamo visto, sarà che il lettore non si accorgerà dell’offuscamento perché il browser opererà in modo automatico l’azione di decodifica del sorgente HTML, dove invece è visibile solo la stringa codificata.

Di questa utile funzione ho preparato uno shortcode, in modo da renderla disponibile anche quando scriviamo un post.

Com’è fatto lo shortcode

Eccolo:

/**
 * Hides email addresses from spam bot.
 *
 * @param array $atts {
 *    The various options. The only required is "address".
 *
 *    @type string  $type    The type of protocol to be used.
 *                           Default: 'email'.
 *                           Accepts: 'email', 'jabber'.
 *    @type string  $address The address to be used (required).
 *    @type string  $class   The CSS class for the HTML element.
 *    @type string  $subject The default subject for the email when the user clicks on the link.
 *    @type string  $text    The text to be linked with the email/Jabber address.
 *    #type boolean $link    If the HTML element should be a link or a span element.
 * }
 * @return string The formatted HTML email link or span.
 */
function ubnsc_email( $atts ) {
	extract( shortcode_atts( array(
		'type'    => 'email',
		'address' => '',
		'class'   => '',
		'subject' => '',
		'text'    => '',
        'link'    => 1
	), $atts ) );

	switch ( $type ) {
		case 'email'  : $protocol = 'mailto:'; break;
		case 'jabber' : $protocol = 'xmpp:';   break;
	}

    $address = sanitize_email( $address );

	if ( $class ) $class = ' class="' . sanitize_html_class( esc_attr( $class ) ) . '"';

	if ( $subject ) $subject = '?subject=' . esc_attr( $subject );

    /*
       Do not escape the last $text variable because it can contain an HTML image:
       $text = empty( $text ) ? $text = antispambot( $address ) : esc_html( $text );
    */
    $text = empty( $text ) ? $text = antispambot( $address ) : $text;

    if ( 1 == $link ) {
        $output = '<a' . $class . ' href="' . $protocol . antispambot( $address, 1 ) . $subject . '">' . $text . '</a>';
    } else {
        $output = '<span' . $class . '>' . $text . '</span>';
    }

	return $output;
}
add_shortcode('email', 'ubnsc_email');

Come si usa

Va inserito nel file functions.php del vostro tema oppure, meglio, in un plugin che sarebbe bene crearsi se — quando cambiate tema — volete portarvi appresso tutte le vostre funzioni personalizzate.

Nella sua forma più semplice si usa così:

[email address="nomeutente@example.com"]

che restituisce:

… la mia email è: nomeutente@example.com

Potete anche specificare il testo da visualizzare in chiaro:

[email address="nomeutente@example.com" text="la mia email"]

che restituisce:

… e questa è la mia email

Se volessimo usare un’immagine al posto del testo in chiaro, ecco come fare:

[email address="nomeutente@example.com" text="<img alt='' src='http://example.com/images/email_offuscata.jpg' />"]

che restituisce questo:

… e questa è la mia email:

Chiaramente l’immagine dovrete prepararla per conto vostro.

Fin qui l’uso più comune. Può capitare, però, che vogliate indicare un indirizzo per il vostro account Jabber. Ecco come farlo:

[email type="jabber" address="nomeutente@example.com" text="il mio account Jabber"]

che restituirà questa riga:

… e questo è il mio account Jabber

Un clic su questo link vi apre il client di messaggistica.

Se voleste infine aggiungere una classe all’elemento A dell’HTML — come nel caso della creazione di un microformato hCard — potete usare questa forma:

[email class=email address="nomeutente@example.com" text="la mia email"]

che sarà restituita così:

… e questa è

Se osservate il sorgente di questa riga vedrete la classe applicata.

Quanto sia realmente efficace questa funzione di WordPress non saprei dirvelo con certezza. Probabilmente è un sistema che può dare una mano a confondere i bot alla ricerca di indirizzi email.

Aggiornamento

Come richiesto da un lettore, la funzione è stata aggiornata inserendo l’opzione per inserire il subject dell’email. Ad esempio:

[email address="nomeutente@example.com" subject="This is the subject"]

Autore: Aldo Latino

Aldo Latino usa con entusiasmo Linux nella distribuzione Ubuntu, è un appassionato di WordPress e si diletta a fare il blogger. Ha anche una lista dei desideri. Per altre informazioni visita la sua .

16 pensieri riguardo “Offuscare le email: lo shortcode per WordPress”

  1. Non funziona…o meglio funziona parzialmente…così com’è scritto viene offuscato solo la parte compresa in href=”….” ma non il testo compreso tra i tag

    1. Lo shortcode dici? Non offusca l’indirizzo nella pagina renderizzata (cioè quella che vedi tu), ma se apri il sorgente HTML della pagina li vedrai offuscati entrambi. Nell’articolo l’ho anche detto.

  2. Ciao,

    ho appena fatto un aggiornamento alla versione 3.9.3 di wordpress e la parte di shortcode relativa al text=”” mi ha dato dei problemi, ho dovuto toglierla dallo shortcode postando solamente questo :[email address="matta@mysite.com" subject="Mail from mysite.com"], in questo modo funziona, é capitato anche a te? come potrei sistemarlo?
    Grazie in anticipo.

  3. Ciao Matta,
    anzitutto devi aggiornare all’ultima versione di WordPress (attualmente la 4.0.1): non è solo un consiglio, ma quasi un obbligo per chi ha un sito gestito in proprio! :)

    Per quello che chiedevi, invece, qui funziona tutto correttamente. Verifica che il testo contenuto dentro text="Testo da linkare" contenga solo caratteri semplici, senza ulteriori virgolette. Magari fai uno screenshot dello shortcode che vorresti usare o incolla il testo in un sito pastebin.

    1. Sì hai ragione sulla versione utilizzata, sto testando la 4.0.1 in un server di prova, ed in effetti su quella versione sembra non avere problemi il tag text. quindi direi problema risolto.
      Grazie per la solita precisione.

I commenti sono chiusi