Emailadressen beschermen tegen spam bots

De php code

Met behulp van reguliere expressies worden mailto-links en emailadressen opgespoord, waarna er een leesbaar emailadres gegenereerd wordt, welke niet als dusdanig herkend zal worden door email spam bots.

Middels de php preg_replace functie kunnen er span-elementen om de gemaskeerde emailadressen worden geplaatst. Deze span-elementen kun je een class naar keuze meegeven.

<?php
function protectEmailadresses($content)
{
    
$content preg_replace
        
(
            
"/<a href=\"mailto\:(\b([A-Z0-9._%-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})\b)\">(.*)<\/a>/Uie"
            
"'<span class=\"eprotectlink\" alt=\"' . base64_encode('$2|$3|$4') 
                . '\" title=\"$2[at]$3[dot]$4\">$5</span>'"

            
$content
        
);
            
    
$content preg_replace
        
(
            
"/(\b([A-Z0-9._%-]+)@([A-Z0-9.-]+)\.([A-Z]{2,4})\b)/Uie"
            
"'<span class=\"eprotecttext\" alt=\"' . base64_encode('$2|$3|$4') 
                . '\">$2[at]$3[dot]$4</span>'"

            
$content
        
);
        
    return 
$content;
}
?>

De javascript

Middels javascript kunnen alle spans met een opgegeven classnaam worden aangesproken, om vervolgens de waarde van de alt-attribuut uit te lezen. Aan de hand hiervan kan het emailadres vanuit javascript weer worden samengevoegd en op de plaats van de gemaskeerde emailadres worden gezet.

Om het aanspreken van elementen eenvoudiger te maken, kan er voor gekozen worden om jQuery te gebruiken. Deze bevat de mogelijkheid om elementen op eenzelfde notatie-wijze als CSS aan te spreken, waarbij geen expliciete loops gescript hoeft te worden om meerdere elementen aan te spreken.

function createEmailBySplit(splitString)
{
    var eParts         = base64_decode(splitString).split('|');
    return eParts[0] + '@' + eParts[1] + '.' + eParts[2];
}

$(document).ready(function() 
{
    $('span.eprotecttext').each( function(i)
    {
        $(this).text( createEmailBySplit( $(this).attr('alt') ) );
    });    
    
    $('span.eprotectlink').each( function(i)
    {
        var mailtoLink    = '<a href="mailto:' + createEmailBySplit( $(this).attr('alt') ) 
            + '">' + $(this).text() + '</a>';
        $(this).html(mailtoLink);
        $(this).attr('title', '');
    });
});

Voorbeeld

Laten we de volgende stukje code nemen, voordat het door php is aangepast:

<a href="mailto:info@domein.nl">Contact opnemen</a> is mogelijk via info@domein.nl.

Door php wordt dit uiteindelijk omgezet naar het volgende stukje code, wat eventuele email-bots dus ook te zien zullen krijgen:
<span class="eprotectlink" alt="aW5mb3xkb21laW58bmw=" title="info[at]domein[dot]nl">Contact opnemen</span> is mogelijk via <span class="eprotecttext" alt="aW5mb3xkb21laW58bmw=">info[at]domein[dot]nl</span>.

Wat er in de webbrowser als volgt uitziet indien javascript is uitgeschakeld
Contact opnemen is mogelijk via info[at]domein[dot]nl.

Indien javascript is ingeschakeld, zal het alle span elementen met de opgegeven classes bij langs lopen en waardes vervangen, met als resultaat:
Contact opnemen is mogelijk via info[at]domein[dot]nl.

In zowel de javascript als php code is te zien dat het herschrijven van emailadressen in twee stappen wordt gedaan. Dit is gedaan om rekening te houden met mailto-links.
Nadat uiteindelijk de mailto-links zijn behandeld, worden emailadressen in teksten aangepakt. De javascript behandelt de uiteindelijke emailadressen weer in omgekeerde volgorde om er weer functionele links en leesbare emailadressen van te maken.


Voordelen en nadelen

Deze methode heeft als voordeel dat links nog steeds op eenzelfde wijze ingevoegd kunnen worden. Gebruikers welke met behulp van een CMS hun website beheren, hoeven geen speciale handelingen te verrichten om emailadressen te maskeren en te voorkomen dat hun inbox doelwit wordt van ongewenste ofwel spamberichten. Daarnaast kan deze methode ook doorgevoerd worden in al bestaande webapplicaties, zonder dat de content zelf bij langs gegaan hoeft te worden.
Het emailadres is voor de mens nog gewoon leesbaar. Indien javascript niet is ingeschakeld is een gebruiker alsnog in staat om de juiste vorm van het emailadres af te lezen. Verder kan het emailadres nog gewoonweg gekopieerd worden en blijven klikbare mailto-links nog gewoon klikbaar, in tegenstelling tot oplossingen die gezocht worden in afbeeldingen.
Uiteraard kan de manier waarop het emailadres in de broncode wordt weergegeven, naar wens worden aangepast door de reguliere expressie aan te passen. Er kan gekozen worden tussen leesbare varianten als info @ domein . nl, info [at] domein [dot] nl, info[@]domein[.]nl, info-at-domein-punt-nl et cetera

Er kleven ook nadelen aan deze oplossing: het kost meer dataverkeer door het gebruik van javascript, echter zullen dit soort bestanden gecached worden door webbrowsers. Ook zal er extra parse time aan te pas komen door het gebruik van reguliere expressies. Eventueel kan de php code in worden gekort en kan het emailadres enkel door de base64_encode- functie gehaald worden, in plaats van het in stukken hakken van het emailadres. De baten zullen uiteindelijk hoger zijn dan de spreekwoordelijke kosten.

Credits voor de javascript versie van de base64_decode functie gaat uit naar Kevin van Zonneveld.