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.