Dinamikus e-mail cím védelem
Ma már nem új fogalom a kéretlen leveleknek a zuhataga, ami nap, mint nap elárasztja az e-mail fiókunkat. Az esetek jelentős részében a weboldalakra publikusan kiírt e-mail címekre vadászó, úgynevezett "mail hunter botok" a felelősek. A legtöbbnek a működése igen egyszerű. A bot lekérdezi egy adott weboldal minden létező url-jét és beolvassa az így kapott HTML DOM-ot. Ezt többnyire felbontja XML formátumra, majd szisztematikusan végigmegy minden soron, míg nem talál egy e-mail címet, vagy ahhoz közelinek tűnő karakterláncot. Miért mondom, hogy közeli? Mert a legtöbb esetben azzal az egyszerű és egyben kijátszható módszerrel szeretnének védekezni ezek a botok ellen, hogy a "@", illetve "." karaktereket kicserélik. Ezeknek vannak általános szabályszerűségei, amiket nagyon gyorsan fel lehet ismerni. Például: felhasznalonev@domainnev.com -> felhasznalonev[kukac]domainnev[pont]com, vagy felhasznalonev[at]domainnev[dot]com. Ugyan ez a minta más esetekben is, így nem nehéz felismerni és átalakítani a botnak. A hogyanjába most nem mennék bele, a cikk célja most a védekezés ezek a támadások ellen.
Mi a megoldás?
Azt kell elérnünk, hogy a beolvasható forráskódban semmilyen módon se szerepeljen az e-mail cím, illetve ne legyen kikövetkeztethető egyszerű módszerekkel. Az sem megoldás, hogy a HTML DOM-ba betöltés után egyszerűen csak beillesztjük az e-mail címet, hiszen azt elvégző JavaScript kódot is átnézheti a bot. Ha abban szerepel egy az egyben leírva az e-mail cím, ugyan ott tartunk. Tehát egy olyan kódot fogunk most készíteni, ami átkódolja az e-mail címünket, majd visszafordítja azt. Az alábbi forráskód futtatásához természetesen jQuery függvénykönyvtár szükséges.
JavaScript
<script type="text/javascript">
$(document).ready(function() {
$('#encrypted_mail').text(encryptEmail('felhasznalonev@domainnev.com'));
function encryptEmail($m) {
var pos = 0;
var temp = '';
for (var x = 0; x < $m.length; x++) {
temp += (($m.charCodeAt(x) * (++pos) - 5) * 15).toString(36);
}
return temp;
}
});
</script>
HTML
<div id="encrypted_mail"></div>
A fenti kód mindössze annyit csinál, hogy a "felhasznalonev@domainnev.com" e-mail címünket felbontja karakterekre, majd végighalad az így kapott tömb elemein. Minden elemnél lekérdezi az adott karakter "unicode" számát a "charCodeAt" függvény segítségével, majd eltolja ezt a számot, végül visszaalakítja ezt a számot újra karakterré a "toString" függvény segítségével. A végeredmény ebben az esetben ez lesz: 14f2a33ox4r95k07xf9trkrxbefcfxuvod4xghr11p3kffbsljm9n2fnwume9pgory9p8cuhx1vd0zg9ebfzwx127f13vf17pr2b9x13a612431dd31a6x1b1r1crf1fuo1cjx1izl3a2f
Azt hiszem ezt magyaráznom sem kell, hogy ezt nem fogja azonnal megfejteni egy spam bot sem. Viszont ebben a formában mi se nagyon tudjuk, hogy milyen e-mail címet takar. Tehát meg kell oldanunk a visszakódolását is.
Megjegyzés:
A fent leírt "encryptEmail" függvény és annak meghívása ne maradjon benne az éles forráskódban! Mindössze ideiglenes szerepe van, méghozzá az, hogy megkapjuk a fordítani kívánt e-mail címünk kódolt alakját. Ha bent hagynánk a forráskódban a bot be tudná olvasni a JavaScript forráskódjából az eredete e-mail címet. Ne adjuk meg ezt az örömöt neki! Illetve az imént leírt 2 függvény és az unicode részletes magyarázatát a rajtuk elhelyezett linkek segítségével találhatod meg.
Most pedig dekódoljunk!
JavaScript
<script type="text/javascript">
$(document).ready(function() {
function fixEmail($m) {
var pos = 0;
var step = 0;
var temp = '';
for (var x = 0; x < $m.length; x++) {
step = x + 3;
temp += String.fromCharCode((parseInt($m.substring(x, step), 36) / 15 + 5) / (++pos));
x = x + 2;
}
return temp;
}
$('#email_link').append('<a href="mailto:'+fixEmail('14f2a33ox4r95k07xf9tra4la1ocfxe2of7xf50j29b1xiglls6mnfl9uo8xqofry9qtuwpxd93tqfymoz9l')+'?subject=Védett e-mail cím :)">Küldj e-mailt</a>');
});
</script>
HTML
<div id="email_link"></div>
A "fixEmail" függvényünk visszaalakítja az eredeti formára a lekódolt e-mail címet, majd az "append" függvény segítségével elhelyezi a linket a "email_link" id-jű div-be. Ezzel gyakorlatilag megoldottuk azt, hogy a weboldal betöltésekor ez a link nem is jelenik meg a HTML DOM struktúrában, hanem csak a betöltés után kerül csak bele. A legtöbb mail hunter bot ellen megfelelő védelmet fog nyújtani.
Mi van több e-mail cím esetén?
Az is megoldás lehet több e-mail cím esetén, hogy a kódolást még a szerver oldalon elvégezzük, mondjuk PHP segítségével és a JavaScript kód már csak a kódolt e-mail címet kapja meg a visszafordításhoz. Ez már csak részletkérdés innentől kezdve.
Leírásaink azon kezdő és haladó programozóknak nyújtanak segítséget, akik már minimális szinten foglalkoztak weboldalkészítéssel. Ha szeretnél jobban elmélyülni a témában, vagy elsajátítani alapokat, még tovább fejlődni, akkor nézz körbe tanfolyam kínálatunkban, ahol a kezdőtől a profi szintig nyújtunk képzéseket a számodra.