E-mail vs. spamrobot

10. januára, 2006 v Tipy, triky, Diskusia (1)

Priznám sa, k napísaniu tohto ma motivoval Peter Šlosar s článkom E-mail sa oplatí skryť. Píše o utilitke, ktorá dokáže zakódovať e-mailovú adresu a skryť ju tak pred „obyčajnými“ spam-robotmi. Zámerne ich označujem ako obyčajných, pretože dnes sa dá dostať prakticky všade a vydolovať kadejaké informácie z kadejakých zdrojov. 

Princíp tohto programu spočíva v tom, že jednotlivé znaky e-mailovej adresy jednoducho prevedie na ich ASCII (resp. decimálne) hodnoty a pridajú sa HTML entity (&# a ;). Tie potom HTML parser vášho prehliadača spracuje a spôsobí to, že e-mailová adresa je pre vás viditeľná a dá sa s ňou pracovať, zatiaľčo pre robota je to zmes znakov, ktoré neobsahujú čarovný zavináč. Zároveň program spracuje zakódovanú adresu, prevedie ju na HTML odkaz <a href=„adresa“>a­dresa</a>, a aby to ešte spam-robotu sťažil, vygeneruje JavaScript kód, ktorým rozdelí celú adresu na niekoľko častí a vypíše ich pomocou metódy document.write().

Keďže program zmienený na Petrovom blogu je nutné si stiahnúť (ale ešte som ho neskúšal), znamená to, že pri každom prevode e-mailovej adresy je potrebné vykonať jej zakódovanie, čo môže byť v niektorých prípadoch nefektívne. Najmä ak sa jedná o väčšie množstvo adries (napríklad diskusné fórum, atď.). Tento úkon sa dá patrične automatizovať, čím sa práca uľahčí a zrýchli. Použijeme na to jazyk PHP.

Ako na to?

O prevod znakov do ASCII kódu sa v PHP stará funkcia ord() . Teda: $ascii_znaku = ord($znak). Stačí tak reťazec (v tomto prípade e-mailovú adresu) rozdeliť na jednotlivé znaky, zacykliť, pripojiť HTML kód a vypísaž výsledok. Najvhodnejšie bude to obaliť nejakou funkciou:

function CodeMail($email, $title = '', $string = '') {
  if ($email) {
    // najprv rozdelime a prevedieme retazec mailto
    $mailto = preg_split('//', "mailto:", -1, PREG_SPLIT_NO_EMPTY);
    for ($i = 0; $i < count($mailto); $i++)
      $mailto_ascii .= "&#" . ord($mailto[$i]) . ";";
    // potom znaky e-mailovej adresy
    $znaky = preg_split('//', $email, -1, PREG_SPLIT_NO_EMPTY);
    for ($i = 0; $i < count($znaky); $i++)
      $email_ascii .= "&#" . ord($znaky[$i]) . ";";
    return '<a href="' . $mailto_ascii . $email_ascii . '" title="' . $title . '">' . ($string ? $string : $mail_ascii) . '</a>';
  }
}

Funkcií predávame okrem e-mailovej adresy aj nepovinný parameter pre obsah atribútu TITLE a ak chceme namiesto emailovej adresy zobrazovať iný reťazec (napr. meno ako odkaz), vyplníme aj parameter $string. Samozrejme funkcia sa dá upravovať k vlastnému obrazu, ako napríklad vypisovať adresu v tvare meno (at) domena.tld, a pod.

Takýto konvertor obsahuje aj formátovač Texy!, kód tejto funkcie je ešte o niečo menší, ako ten môj (reťazec sa nerozdeľuje pomocou funkcie preg_split()) :)

Jednoduchšou variantou môže byť nahradenie zavináča samotného jeho ASCII ekvivalentom, teda napr. meno&#64;dome­na.tld. Variánt pre skrytie e-mailu je naozaj strašne veľa a popisovať všetky by nemalo zmysel. Otázkou je, či je naozaj nutné e-maily pred spammermi skrývať, keď vlastne stále je možnosť ich odhalenia, veď časom sa každá finta rozlúskne a spam si cestu k ním nájde…