Poznámka: články jsou již mnoho let staré, doba se posunula, mnoho věcí v nich doporučovaných je již dnes překonané - berte s rezervou!


Ochrana e-mailové adresy před spam-roboty v ASP.NET

Proč chránit emailové adresy?

Emailové adresy je potřeba uvádět na webu, nejde to ale jen tak, protože nijak nechráněná emailová adresa se snadno stane kořistí crawlerů (emailových harvesterů), kteří prolezají internetové stránky jednu za druhou a sbírají emailové adresy. Získanou sbírku emailů potom mohou například prodat firmám, které rozesílají spam. V takové databázi přirozeně nikdo nechce být a zde si můžete stáhnout ASP.NET komponentu, která vás toho uchrání.

Způsobů ochrany emailové adresy vypsané do stránky je mnoho, uvedu ty, které mě zrovna napadají

Žádná ochrana

Pokud vypisujete svou emailovou adresu do svých stránek bez jakékoliv ochrany, je to váš problém, ale vypisovat takto adresy uživatelů vašich stránek, za to by se mělo nakopat do ...

"Opatrný formát adresy"

Roboti sbírající emaily jsou obvykle postavené na prohledávání textu a porovnávání jeho částí vůči regulárnímu výrazu. Pasou především po sekvenci "mailto" (ty jsou součástí odkazu, pokud je adresa vypsána přímo jako odkaz, na který jde kliknout a otevřít tím okno webového klienta) a znaku zavináče - @ (který je součástí každé adresy). Když oželíme "klikatelný odkaz" a adresu vypíšeme třeba takhle:
petr.voprsalek(zavinac)hotmail.com,
žádný robot si jí nevšimne. Problém je již zmíněná absence odkazu a také to, že návštěvník stránky nemůže jednoduše text adresy zkopírovat, ale musí ho opsat. Bezpečné to je ale 100%.

Html entity

Pokud opět oželíme odkaz a zavináč (popřípadě některé další znaky v emailové adrese, třeba tečku nebo kterékoliv jiné) nahradíme jeho html entitou &#064 (a další znaky zase jejich entitami), některé z robotů to zmate, ale vsadím krk, že jsou již roboti, kteří si entity překládají, takže vlastně jako by se nic nestalo. Přesto zakrytí entitami považuje mnoho lidí za dostatečnou ochranu.

Obrázek

Misto adresy, můžem vložit do stránky obrázek, na kterém je adresa napsaná - roboti obrázky nijak neinterpretují, lidi ano. Odřízneme tak ale uživatele, kteří si obrázky nestahují (mají je vypnuté) - třeba ty, co se na stránku dívají skrz mobilní telefon nebo zrakově postižené.

JavaScript

Adresu můžeme nechat vypsat do stránky JavaScriptem. Roboti JavaScript neumějí, proto ho ignorují. Takto dokonce můžeme vložit i odkaz. Problém je, že někteří uživatelé mají JavaScript vypnutý (těm nabídneme alternativní <noscript> verzi).

Další....

Jsou jistě i další metody (rád se nějakou dozvím), například na intervalu je jeden návrh - takovýto CSS kód, který rendruje text pozpátku, adresu pak vložíme do stránky taky pozpátku (třeba moc.liamtoh@kelasrpov.rtep). Ochrana je to dobrá ale adresa zase nejde zkopírovat přes schránku (zkopíruje se adresa pozpátku).

.pozpatku { unicode-bidi:bidi-override; direction: rtl; /*right - to - left */ color:#c00; }

Moje řešení: User-Control komponenta v ASP.NET

Pokud vaše stránky používají ASP.NET, můžete si stáhnout komponentu, kterou používám já na těchto stránkách. Inspiroval jsem se na CodeProjectu. Idea je stejná, jako v článku Jos Branderse - napsat komponentu, která bezpečně vloží do stránky emailovou adresu. Pro uživatele/browsery vybavené JavaScriptem se vloží JavaScriptem vygenerovaný odkaz, pro ostatní se adresa vypíše v "opatrném formátu". (Tady je rozdíl v mojí komponentě - Joe Branders totiž místo "opatrného formátu" uživatelům bez JavaScriptu předkládá obrázek. To je ale podle mě zbytečně složité a výsledek za to nestojí.

Vlastní použití mojí komponenty:

Stačí stáhnout si zdrojový kód v zip balíku. SafeEmail.zip Uvnitř najdete soubory SafeEmail.aspx a SafeEmail.aspx.cs, ve kterých je třída definovaná a soubor Default.aspx a Default.aspx.cs, kde jsou uvedeny příklady použití komponenty.

Ve vašich stránkách se na soubor s komponentou odkážete ASP.NET direktivou Register takto:

<%@ Register TagPrefix="SE" TagName="SafeEmail" Src="SafeEmail.ascx" %>

A v kódu stránky pak můžete psát:

<SE:SafeEmail ID="Adresa1" Address="petr.voprsalek@hotmail.com" LinkText="Petr Vopršálek" LinkCssClass="maillink" Title="Zaslat email" runat="server" />

Vysvětlení atributů (nejlépe jim porozumíte, pokud si otevřete soubor s příklady Default.aspx):

  • Address: adresa, kterou chcete vložit do stránky
  • LinkText: text, který bude mezi tagy <a></a> (nepovinný - defaultně adresa)
  • LinkCssClass: CSS třída, která bude přiřazena odkazu - atribut class tagu <a> (nepovinný)
  • Title: titulek odkazu - atribut title tagu <a> (nepovinný)

Pokud atribut Address nedostane platnou emailovou adresu (kontroluje se jen přítomnost znaku zavináč), vyrendruje se pouze tento zadaný text.

Komponentu můžete používat jak chcete, máte volné ruce v úpravách kódu (je prostý, ale drobné úpravy může potřebovat každý). Pokud budete chtít něco vědět, zeptejte se. Pokud komponentu použijete, budu rád, když odkážete na tento článek (ale nenutím vás).

Ohodnoťte prosím užitečnost článku




36
 
63
 
43
 
47
 
5
 
 
Vložit komentář:
 

 



 

 

Nepoužívejte žádné html ani texy značky, odřádkování se zachová. Pokud uvádíte zdrojový kód, můžete ho vložit mezi značky
<syntax jazyk="PHP">...</syntax>,
bude potom zformátován. Jako atribut můžete uvést PHP, C#, HTML, CSS a mnoho dalších.


opiste cislo Opište číslo:

 

11/22/2006 5:50:50 PM
[1] (cniry (cniry(at)atlas.cz))
To je všecko sice moc hezké ale... odpovědět
To je všechno sice moc hezké ale nemohl by to někdo pls přepsat do php? Zkusil bych to ale mám bohužel až moc práce. Pokud by to někdo udělal, pošlete mi prosím mejl. V php by to to bylo žádanější než v asp. Skoro žádný freehosting asp nepodporuje nebo ho nepodporuje zcela. Už dlouho nad tím koumám a vykoumal jsem jen to, že zavináče a tečky odděluji pomocí lomených závorek [].
3/27/2007 2:50:40 PM
[2] (Piero (pietro(at)dotnetgroup.sk)) www
PHP odpovědět
Tak tu ti davam funkci, ktora ti spravi nieco podobne v php:
function emailcrypter($email) { $crypt_email=""; $max_zeichen=strlen($email); for ($i=0; $i<$max_zeichen;$i++) { $zeichen=substr($email,$i,1); $ascii_wert=ord($zeichen); $crypt_email.="&#".$ascii_wert.";"; } return $crypt_email; }

vrati ti to zakodovany email...v browsri ale bude pekne citatelny..
Pa...
3/27/2007 3:05:47 PM
[3] (Trupík (jakub.maly(at)atlas.cz)) www
Re: PHP odpovědět
[2] ale pozor, metoda nic neukrývá, jen převádí znaky na jejich číselnou reprezentaci v ascii. Robot pátrající po adresách může být na tuto techniku připraven a adresu si přeložit z ascii do plaintextu sám (a věřím, že takoví skutečně jsou).
9/21/2008 2:09:38 PM
[4] (Honza (honza.89(at)seznam.cz)) www
diky odpovědět
dekuju moc jste mi pomohli. do meho bazarku jsem nakonec vlozil tu opatrnou verzi.
11/2/2008 3:17:21 PM
[5] (Vitek (kontakt(at)vit-stekly.cz)) www
Re: Re: PHP odpovědět
[3] jo ale uvědom si že neexistuje způsob na který by robot nemohl být připravený. Co ti dokáže přelouskat browser robot to taky dokáže ať už je to od javascriptu po css triky roboti jsou pro tyhle triky dost vymakaný a věřim že ani to tvoje aktuální zabezpečení není 100% :)