ugrás a tartalomhoz

WHAT, avagy küzdelem a spam ellen

Bártházi András · 2004. Május. 10. (H), 22.00
WHAT, avagy küzdelem a spam ellen
Ha az ember e-mail címe valahogy, valahol megjelenik az interneten, bizony egyre több kéretlen reklámlevelet fog kapni. Ha belenyugszunk ebbe, akkor a közeljövőt tekintve csak a helyzet romlására számíthatunk, ezért érdemes valamit tenni a begyűjthetőség elkerülése érdekében. Védekezni azonban egyre nehezebb, és az e-mail címünk váltogatása havonta nem mindig a legjobb módszer. Cikkemben egy saját fejlesztésű, viszonylag egyszerű, de a lehetőségekhez képest hatékony védelmi lehetőséget mutatok be, amivel itt a Weblaboron is védjük a megjelenő e-mail címeket.

A sorozatban megjelent

Probléma

A probléma a spammerek által üzemeltetett, az interneten körbe és körbe járó, weblapokat látogató robotok munkájával van, melyek a megjelenített e-mail címeket folyamatosan gyűjtik. A feladat ebből adódóan az, hogy úgy jelenítsük meg ezeket a címeket, hogy a látogató továbbra is el tudja olvasni, de egy robot már ne. Az se hátrány, ha továbbra is kattintható marad a link, és a látogatónak nem kell bemásolnia, vagy kézzel bepötyögnie, átírnia.

Lehetőségek

Elég sok megoldás született a problémára, de egyiknél sem igazán éreztem úgy, hogy jó megoldást biztosítana, viszont mindegyik valamilyen olyan ötleten alapul, melyet talán fel tudunk használni egy saját védelem írásakor, nézzük tehát meg, hogy milyen megoldások használatosak.

E-mail cím betűkkel

Talán ez a megoldás az, amelyik a leginkább elterjedt. A lényege, hogy a kukac és pont jeleket angolul (esetleg más nyelven) írják ki. Erre egy tipikus példa: sanyi at pelda dot hu, illetve ugyanez magyarul: sanyi kukac pelda pont hu. Az eljárás egyik hátránya, hogy így nem lesz kattintható az e-mail cím, továbbá hogy - főleg az angol megoldás - annyira ismert, hogy biztos vagyok benne: a spammerek simán felismerik ezeket az e-mail címeket is.

Hibás e-mail cím

Egy másik lehetséges trükk, hogy az e-mail címünket torzítva, hibásan írjuk ki. A sanyi.kukac##kukac##pelda.pont.hu vagy a sanyiNEKULDJSPAMET##kukac##pelda.hu tipikus példák erre. Ez a megoldás talán elég jó, és valódi védelmet nyújtó, viszont előfordulhat, hogy nemcsak a robotnak, hanem az oldal látogatójának sem esik le, hogy mit kell módosítani (persze ezt szövegesen akár jelezhetjük is), illetve továbbra sem kattintható a cím.

Kódolások

Hívhatjuk a HTML-t segítségül, és például entity-kkel kódolhatjuk az e-mail címet: sanyi@pelda.hu. Személyes véleményem szerint ezt a spammerek már rég megkerülték, figyelnek erre. Ez az e-mail cím sem lesz kattintható.

Képek

Az e-mail címet megjeleníthetjük úgy, hogy egy képet gyártunk belőle, majd úgy tesszük ki. Első ránézésre elég jó megoldás lehet, s talán másodikra is, de azért nem árt tudnunk: egy ilyen képet nagyon könnyen fel lehet akár programból is ismerni. A kérdés, hogy a spammerek áldoznak-e erre gépidőt: a válasz pedig, hogy valószínűleg nem. Ettől függetlenül mailto:-s linkként nem jeleníthető meg így sem a kép. Egy megoldás lehet, hogy az így kitett e-mail címre kattintva egy form jön be, ahol lehetőséget adunk e-mail küldésére...

Egy általam elég sokáig használt megoldás az volt, hogy az e-mail címből a kukacot egy képpel jelenítettem meg. Ez is talán egész jó védelmet nyújt, viszont ez sem kattintható.

Javascript

Hívhatjuk segítségül a Javascriptet, és elég jó megoldást is nyújthat. A kérdés, hogy mit teszünk?

Egyik (látszat) megoldás, ha document.write() segítségével írjuk ki az e-mail címet, például document.write('sanyi##kukac##pelda.hu'). Bár magában a HTML kódrészletben nincs ott az e-mail cím, de a dokumentum forrásában továbbra is szerepel...

Ezt viszont tovább lehet fejleszteni. Egy lehetőség, hogy az e-mail címet elkódoljuk, és valamilyen felismerhetetlen formában tároljuk le (például egy tömbben számokként), majd ezt írjuk ki, dekódolva. Erre egy példát a e-mail riddler mutat a DynamicDrive-on. A megoldás egész jó, s végre elérkeztünk oda is, hogy kattintható e-mail címet kaptunk! Ez a védelem nagy valószínűséggel működik is, viszont a jövőben könnyen lehet vele probléma, amint a spammerek elkezdik a dokumentumokban található Javascripteket lefuttatni. Erre elég reális esély van, hiszen számos Javascript futtató elérhető, könnyen megoldva így a problémát. Ennek ellenére ezt a módszert fejlesztettem tovább, a későbbiekben kitérek arra is, hogy miért?

A további Javascript megoldások gyakorlatilag hasonló eljárásokat kínálnak, kisebb/nagyobb fokú kódolás megvalósításával. Mindnek egy hátránya van: a felhasználó előtt teljesen rejtve marad az e-mail cím, ha ki van kapcsolva számára a Javascript.

Flash/Java

Akármilyen furcsa, egész jó szolgálatot tehet mindkét megoldás. A lényeg, hogy vagy egy Flash, vagy egy Java applet segítségével jelenítsük meg az e-mail címet. Mindkét esetben a kattinthatóság is teljesen megnyugtatóan megoldható, úgy, hogy az e-mail címnek a forrásban nyoma sincs. Több probléma is lehet, az egyik, hogy nehéz az automatizálást megoldani, vagyis dinamikusan generálni az oldal minden e-mail címéhez egy ilyen megjelenítést. Másrészt ha nincs valakinek Flash vagy Java támogatása a böngészőben, akkor nem látja az e-mail címet. A generálásra megoldás lehet, hogy paraméterként, kódolva adjuk át az e-mail címet, melyet az Actionscript/Java program dekódol, majd megjelenít. Ezen kívül még problémának tartom azt is, hogy nehéz az oldalba, a folyó szövegbe illeszteni ezeknek a megjelenését.

Egyéb lehetőségek

Biztosan vannak általam nem ismert, további lehetőségek, bár ezek valószínűleg nem tudnak teljes megoldást nyújtani. Ha valaki ismer ilyeneket (akár teljes megoldás, akár nem), szívesen veszem, ha a hozzászólásával kiegészíti a cikket, hogy mindannyian okulni tudjunk, esetleg egy újabb módszert fedezhessünk fel!

Egy lehetséges megoldás: WHAT

A WHAT nem másnak, mint a nagyképűen "WHAT is a Hipersuper Antispam Technology" névre keresztelt megoldásnak a betűszava. Azt tűztem ki célul, hogy az oldalon levő mailto:-s linkeknek továbbra is működnie kell, és hogy nem szabad a felhasználónak még észrevennie sem a védelmet, illetve hogy olyan megoldás nem lehet, ami valamilyen technológia használata esetén elérhetetlenné tenné az e-mail címet. Így született meg ez a Javascriptre épülő megoldás, melynek lényege, hogy a kukac jel helyett ##kukac## szöveget írunk mind a mailto: részbe, mind a link elemek tartalmába (ha akarjuk). Megjelenítéskor az oldalon az onload esemény hatására egy kis Javascript program kukac jelre cseréli ennek minden előfordulását. A korábbiakban említett e-mail riddler nevű megoldáshoz képest azért képes nagyobb védelmet nyújtani, mert ha egy spammer ezt ki szeretné játszani, a böngésző DOM modelljét is le kell modelleznie, ami egy fokkal nagyobb programozási teljesítményt igényel, és manapság biztosan nem éri meg.

A megoldás egyszerűsége miatt a legtöbb böngészőben működni képes, illetve az esetek többségében a Javascript is be van kapcsolva, tehát ez sem okozhat problémát. Ha mégsincs, vagy a böngészőprogram nem támogatja, a látogató akkor is fel tudja ismerni, hogy itt egy e-mail címről van szó, amit neki módosítani kell, ha használni szeretné. A megoldás további előnye, hogy valamennyire egyedi, nem más, nemzetközileg ismert megoldásokat másol, így egy bizonyos fokú védelmet biztosít az ellen is, hogy a spammerek beépítsék.

Maga a Javascript rutin a következőképpen néz(ne) ki:

function whatCorrector() {
  var replaces=0;
  while (document.body.innerHTML.indexOf('##'+'kukac##')!=-1 &&
       replaces<10000) {
  document.body.innerHTML=document.body.innerHTML.replace('##'+'kukac##',String.fromCharCode(64));   
  replaces++;
}
Először egy számlálót állítok be nullára. Ez azt fogja számolni, hogy mennyi csere történt - ha végtelen ciklusba kerülne valamiért a kód (mert nem tudja lecserélni a dolgokat, de észleli, hogy van ilyen), akkor sem száll el a böngésző, a függvény kis idő után leáll. A while cikluson belül kerülnek lecserélésre a kukac jelek.

A kódon azonban egy kicsit módosítani kellett a használata során, ugyanis kiderült, hogy a Mozilla böngészők alatt, mikor egy textarea-ban cserélte le a ##kukac## részeket, extra sortöréseket szúrt be, ami nem mindig volt nyerő. Erre az ötlet az volt, hogy egy speciális osztályba (whateffect) sorolt div elemeken belül levő előfordulásokat kell csak figyelni, és csak azokon belül kell cserélni. Ez megoldotta a problémát, a kód így a következő lett:

function whatCorrector() {
  var replaces = 0;
  var alltags = document.all ? document.all.tags("DIV") : document.getElementsByTagName("*");
  for (i=0; i < alltags.length; i++) {
    if (alltags[i].className == 'whateffect') {
      while (alltags[i].innerHTML.indexOf('##'+'kukac##') != -1 && replaces < 10000) {
        alltags[i].innerHTML = alltags[i].innerHTML.replace('##'+'kukac##', String.fromCharCode(64));
        replaces++;
      }
    }
  }
}
Nagy trükk nincs a forráskódban. Először lekérdezi az összes elemét egy dokumentumnak, majd végigmenve rajtuk ellenőrzi, az osztályuk 'whateffect'-e? Ha igen, akkor azon belül ugyanúgy, mint a korábbi megoldásban, lecserél.

A függvényt tehát a body elem onload eseménye segítségével lehet meghívni:

<body onload="whatCorrector();">
...
</body>
A szerver oldalon meg kell még oldani a megfelelő kiiratást, cserét, ami azonban elég könnyen automatizálható - ahogy itt a Weblaboron is tettük. Erre egy példakód - persze tetszés szerint variálható a dolog, akár a sablonrendszerbe is integrálható:
<?
function echoEmail($txt) {
  return str_replace(chr(64), "##kukac##", $txt);
}

echoEmail('Az e-mail címem: <a href="/sanyi##kukac##pelda.hu">sanyi##kukac##pelda.hu</a>');
?>
Akinek megtetszik a kód, használja egészséggel, azonban a konkrét másolástól óva intenék mindenkit, hiszen lehet, hogy egy rosszindulatú spammer ezt a cikket olvasva egyből ír egy szűrőt erre a megoldásra is. Ebben az esetben nagyon igaz: az egyedi kód biztosan nagyobb védelmet nyújt, mint a széles körben használt, ismert.
 
Bártházi András arcképe
Bártházi András
Az Emarsys-nál dolgozik vezető fejlesztőként, és az API-ért, integrációkért felelős termékmenedzserként. Szeret profi csapatban profit alkotni.
1

ez az egész értelmetlen

Anonymous · 2004. Jún. 23. (Sze), 12.02
Sziasztok,

A spammer nem azért spammel mert kéjes érzés tölti el, hogy ki tudott küldeni x millió emailt. Hanem azért, mert üzletet lát a dologban, el akar adni neked valamit. Egész egyszerűen nincs értelme, hogy olyan ember címét gyűjtsék be, aki a címének kiírási módjával jelzi: nem kér spamet, ő nem potenciális vásárló. Mert igen, vannak olyan állatok, akik vásárolnak a spammerektől...
2

Gyakorlat?

Bártházi András · 2004. Jún. 23. (Sze), 12.10
Szia!

Ez tök jól hangzik, de bár én jelzem folyamatosan, hogy nem kérek spam-et, kapok. :) És még egyszer sem vettem spammerektől semmit, évente egyszer kattintok a linkekre (azt is véletlenül). E-mail gyűjtő botok pedig elérhetőek, letölthetőek, egyre inkább fejlődnek - a fejemet a homokba dugom módszer nem segít.

Szóval a gyakorlat nem azt bizonyítja, amit te mondasz, a spammerek nem így gondolkodnak.

-boogie-
3

Ugye nem...

T.G · 2004. Jún. 23. (Sze), 23.08
Ugye ezt te se gondolod komolyan???

Vannak olyan állatok is, akik fizetnek, hogy ne kapjanak spameket...
5

Másik megoldás

sajt · 2004. Szep. 16. (Cs), 11.38
Itt van egy másik megoldás a javascriptre: http://amon.hu/oldal/whatspam2
6

és mégegy...

pErMiKe · 2007. Feb. 13. (K), 13.20
Az egyik készülő oldalamon hasonló elven alapuló (saját kútfőből származó) scriptet használok, és teljesen bevált.

Üdv: SamY
7

"Az ellen nem véd"

vbence · 2007. Feb. 13. (K), 13.44
Ez olyan, mint az ember-teszt. Ha ugynazt a védelmet használják sokan, akkor már megéri rá írni egy algoritmust a mailcímekre vadászó botnak.

Másrészt a "kukac" és a "pont" beépítése a címbe ugyan az ember által megfejthető fromában hagyja a címet, de egy sgyezrű regex átalakítás után az oldal címei felfedődnek. Még akkor is, ha variál a felhasználó vele.. lehet az akár ##kukac## vagy ((kukac)) vagy bármi más.
8

Küzdelem a SPAM ellen

ashtor · 2009. Szep. 10. (Cs), 09.04
Spamvédelemre JavaScript e-mail kódolást használók. Ennek millió verziója létezik, a felhasználó fantáziájától függően.

Találtam egy oldalt, a spampoision-hoz hasonlóan tele szemeteli a spamlistákat gagyi e-mail címmel:

http://www.megalapozott-dontes.hu/anti-spam.html
9

Küzdelem a linkspam ellen

vbence · 2009. Szep. 11. (P), 13.49
Az oldal gazdája talán el tud bolondítani pár bloggert akik majd a spem elleni küzdelem jegyében többtizes linkmennyiségel támogatják az oldalát.

A Weblabor ne tartozzon ezek közé. Ha van szabad moderátori kapacitás jólenne ez utóbbi posztok törlése.

Amennyiben hirtdetni szeretnéd az oldaladat küldd be blogmarkként. Talán kapnál pár konstriktív javaslatot is kissé gyermekded módszered tökéletesítésére.