Offuscare le email: lo shortcode per WordPress

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( $email_address, $hex_encoding );

dove $email_address è l’indirizzo email e $hex_encoding serve a indicare a WordPress se deve offuscare l’indirizzo (1) o no (0). Per capire meglio la variabile $hex_encoding, 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 $hex_encoding = 1 va usata come indirizzo per href, mentre $hex_encoding = 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    Whether the HTML element should be a link or a span element.
 * }
 * @example [email address="name@example.com"]
 * @return string The formatted HTML email link or span.
 */
function ubnsc_email( $atts ) {
    $defaults = array(
        'type'    => 'email',
        'address' => '',
        'class'   => '',
        'subject' => '',
        'text'    => '',
        'link'    => '1',
    );
 
    $atts = shortcode_atts( $defaults, $atts );
 
    switch ( $atts['type'] ) {
        case 'email':
            $protocol = 'mailto:';
            break;
        case 'jabber':
            $protocol = 'xmpp:';
            break;
    }
 
    $atts['address'] = sanitize_email( $atts['address'] );
 
    if ( $atts['class'] ) {
        $atts['class'] = ' class="' . sanitize_html_class( esc_attr( $atts['class'] ) ) . '"';
    }
 
    if ( $atts['subject'] ) {
        $atts['subject'] = '?subject=' . esc_attr( $atts['subject'] );
    }
 
    if ( empty( $atts['text'] ) ) {
        $atts['text'] = antispambot( $atts['address'] );
    }
 
    if ( '1' === $atts['link'] ) {
        $output = '<a' . $atts['class'] . ' href="' . $protocol . antispambot( $atts['address'], 1 ) . $atts['subject'] . '">' . $atts['text'] . '</a>';
    } else {
        $output = '<span' . $atts['class'] . '>' . $atts['text'] . '</span>';
    }
 
    return $output;
}

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ì:

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

che restituisce:

… la mia email è: nomeutente@example.com

Potete anche specificare il testo da visualizzare in chiaro:

... e questa è [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:

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

che restituisce questo:

… e questa è la mia email: email_offuscata

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:

... e questo è [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 è la mia email

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

Qualora volessimo soltanto visualizzare l’indirizzo email senza farlo apparire come un link, basta usare l’opzione link="0" e l’output sarà senza link, ad esempio:

... e questa è la mia email: [email address="nomeutente@example.com" link="0"]

che restituirà:

… e questa è la mia email: nomeutente@example.com

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"]

aldolat

Il blocco note di Aldo.


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