Braňte se proti spamu - zabezpečte své internetové stránky

19. srpna 2008

Programování

Nevyžádané emaily (SPAM) tvoří naprostou většinu emailové komunikace a kromě obtěžování uživatelů přinášejí i zvýšené požadavky na kapacitu emailových serverů (ať už se jedná o zátěž spojenou s prostým přijetím zprávy nebo její následné antispamové analýzy). Přestože dnes existují pokročilé antispamové nástroje, které dokáží například analyzovat i v jeden čas velmi populární texty zaslané v podobě obrázku, stále není ochrana proti nevyžádané poště zdaleka stoprocentní a stále denně ve své poště nacházíme reklamy na všelijaké viagry nebo zázračné výhry.

V dnešním článku Vám neporadím, jak zabezpečit Váš server proti tomu, aby z něj spammeři zdarma a "beztrestně" rozesílali SPAM (částečně probráno v minulém článku), ale zaměřím se na zcela jinou oblast – sběr (skenování) emailových adres na internetu pro využití k nelegálnímu zasílání SPAMu a zejména možnostem obrany proti tomuto jevu na Vašich stránkách.

Kde na mě přišli?

Asi každého příjemce SPAMu v první řadě napadne otázka "Vůbec je neznám – kde proboha sebrali moji adresu?"

Cest do adresáře spammerů je samozřejmě vícero (registrace do pochybných internetových diskusních for nebo obchodů, hacknuté databáze,...), osobně bych však tipoval jako největší zdroj emailových adres právě skenování internetových stránek a "vyzobávání" řetězců vyhovujících tvaru jmeno @ domena . tld.

Ono totiž naprogramovat skript, který načte HTML kód z určité adresy, vytáhne z ní veškeré emailové adresy (například dle řetězce "mailto:" nebo @) a za podobným účelem navštíví i všechny ostatní adresy na stránce není zase tak složité, jak by se možná mohlo na první pohled zdát (kdysi jsem to ze studijních důvodů zvládl za méně než hodinu).

Potom už stačí najít nějakou vhodnou startovací stránku (např. bloguje.cz nebo prakticky libovolné phpBBforum) a databáze tisíců emailů je na světě.

Běžné ochrany proti skenování emailů

Důležité české stránky, které obsahují velké množství emailových adres, dnes již většinou naštěstí nikde v kódu nic ve stylu mailto: jmeno @ domena . tld nemají (bloguje jsem chvíli hledal :-)), takže základní osvěta míří spíše na tvůrce drobných webů, které obsahují kontaktní emaily v patičce nebo na stránce s kontakty.

Velmi používanou ochranou je přepsání adresy do takové podoby, která bude srozumitelná lidem, ale nikoli běžným robotům. Jako první se objevovaly zahraniční varianty přepsání typu jmeno (at) domena (dot) tld nebo jeho česká alternativa jmeno (zavináč) domena (tečka) tld. Na seznamu pro změnu používají variantu jmeno(domena.tld).

Všechny tyto způsoby jsou funkční a u méně důležitých webů s nízkým počtem emailových adres budou velmi pravděpodobně ještě nějakou dobu stačit (u anglické varianty s atdot bych však byl opatrný - používá to příliš mnoho lidí...). Nevýhodou však je, že se na takovéto adresy nedá kliknout, nespustí se automaticky Outlook a celé je to takové dost nepraktické pro komerční stránky.

Donedávna jsem znal pouze jednu techniku pro ochranu emailových adres při zachování "klikatelnosti" – převod znaků emailové adresy do ascii sekvencí ve formě &#[ascii ord znaku]; (funkční demo například zde).

Všechny používané internetové prohlížeče po načtení automaticky ascii sekvence nahrazují za normální znaky, takže uživatel (i Outlook) se již dostanou k prostému čitelnému textu a ve zdroji HTML přitom žádné použitelné emailové adresy nebudou (pozn.: lze zakódovat nejen emailovou adresu, ale i text mailto:). 

Samozřejmě není problém upravit skener emailových adres tak, aby ascii sekvence zpracovával, ale již se jedná o zdržení, kterého se mnozí spammeři budou chtít vyvarovat (a radši se na Váš web vykašlou). Weby s větším počtem emailových adres by se však s podobným řešením neměly spokojit – hrozí vytvoření skeneru na míru!

Pokročilejší ochrana proti skenerům - emaily jako obrázky

Obava z prolomení ochrany pomocí ascii sekvencí mě u jednoho důležitějšího projektu přiměla hledat jiná řešení. Na jistém zahraničním serveru jsem viděl službu, která nahrazovala emailové adresy za obrázky. Rozhodl jsem se naprogramovat něco podobného.

Všechny mé redakční systémy načítají obsah stránek do bufferu (ob_start...), takže není velký problém celý obsah před odesláním do prohlížeče prozkoumat na přítomnost emailových adres (pomocí regulárního výrazu a funkce preg_match_all).

Zjistím seznam emailů, pro každý vytvořím jednoznačný identifikátor, a následně všechny emaily nahradím za dynamicky generovaný obrázek (v query stringu je identifikátor emailu). V poli SESSION mám u každého identifikátoru schovánu původní nezakódovanou emailovou adresu, takže poté již stačí pouze pomocí funkcí knihovny GD2 nakreslit email v designu stránek (jak to vypadá můžete vidět například na Vyplňto.cz).

Celé řešení, které jako jediné emaily chrání prakticky 100% (těžko někdo bude provádět OCR), má bohužel svá slabá místa. E-maily sice mohou návštěvníci stránek bez obav přečíst (a nemusí tak luštit, co znamená atdot), ale nemohou na ně jednoduše kliknout a spustit editor zprávy v Outlooku. Rovněž není možné email zkopírovat do schránky (max. jako obrázek) a přenést jej do políčka komu. U komerčních webů je proto vhodné vytvořit ještě formulář pro odeslání zprávy na daný email po kliknutí.

Méně důležitým, ale přesto nepříjemným problémem, jsou formulářová políčka (je zapotřebí napsat regulární výraz sofistikovaněji, jinak se budou např. nahrazovat i emaily v nastavení kontaktních údajů uživatele) a validita kódu (obrázky se generují dynamicky a zjištění rozměrů obrázku může být v době nahrazení emailu obrázkem relativně časově náročné – většinou proto rozměry těchto obrázků nenastavuji).

Pokročilejší ochrana proti skenerům - javascript a AJAX

Komentátory tohoto blogu jsem se rozhodl ochránit proti SPAMu vskutku unikátně – pomocí javascriptu. Celý skript je podobný jako v případě nahrazování emailů za obrázky, rozdíl je pouze v tom, že místo obrázku nahrazuji email textem "email schován" a do titulku odkazu schovávám vygenerovaný hash emailu. Po načtení stránky se ajaxem stáhne XML soubor s emailovými adresami (samozřejmě nejsou ve tvaru jmeno@domena.cz) a provede se zpětné nahrazení.

Z pohledu uživatele se na první pohled zdá, že email není nikterak chráněn (není ničím omezen – může klikat i kopírovat), z pohledu spammera se jedná o překážku téměř srovnatelnou s nahrazováním emailů za obrázky.

Závěr

Máme štěstí, že je většina spammerů primárně orientována na jiné země než je ta naše, takže nejsme pro jejich skenery zase tak atraktivní. Občas se k nám nějaký zatoulá (díky odkazům z cizích webů), ale málokdo si dá tu práci, aby primárně vytvořil skener diskusního fora nějakého idnesu s ubohými statisíci emailových adres.

Proto nám stačí vymyslet pouze nějakou prolomitelnou (ale pokud možno co nejméně tradiční) variantu, která bude naše zákazníky / návštěvníky co nejméně omezovat. A doufat, že si zrovna naše stránky nevyhlédne nějaký novodobý Aleš Slabý...

Zcela jistě jsem nevyčerpal všechny možnosti ani rozšíření obrany proti skenerům emailových adres – například javaskriptové nahrazování jmeno (zavináč) doména (tečka) tld za běžné klikací odkazy jmeno@domena.tld. Základní myšlenkové nakopnutí se mi však snad povedlo – uvítám Vaše komentáře a doplnění v diskusi :-)

Publikováno dne 19. 08. 2008 v kategorii Programování Odhadnutá klíčová slova BETA: proti | spamu | ochrana | chránit stránku proti sběru adres | adresy | emailove | nahrazeni | emailů | zavináče
Mohlo by Vás zajímat BETA: Jak zabezpečit chat nebo diskusní forum proti škůdcům

O kategorii Programování

V nejodbornější kategorii tohoto blogu jsou zařazeny články s mými programátorskými zkušenostmi získanými několikaletou praxí tvorby stránek a java aplikací pro mobilní telefony.

Komentáře k článku

POZOR: K článku zatím nebyl vložen žádný komentář, takže s velkou pravděpodobností nikoho neurazil, nikoho nepobavil a už vůbec nikomu nepomohl.

Přidat vlastní komentář:
Jméno:
E-mail:
Sledovat diskusi:
Web:
Kontrolní kód:

Komentáře jsou v prvé řadě určeny ke kladení dotazů k tématu, upozornění na chybu, rozšíření obsahu článku a vůbec ke zpětné reakci na obsah těchto stránek. Mé reakce jsou barevně odlišeny.

V současné době není umožněno vkládat HTML tagy - pokud vložíte HTML kód, bude převeden na entity. K Vašemu komentáři se do databáze uloží čas vložení a Vaše aktuální IP adresa (3.21.100.34). IP adresa se nebude zobrazovat čtenářům, nicméně v případě, že bude Váš odkaz shledán právně závadným, může být Vaše IP adresa předána příslušným státním orgánům. Emailové adresy jsou ochráněny před běžnými spam roboty.

© Marek Demčák 2007 - 2024
Všechna práva dle Autorského zákona (č. 121/2000 Sb.) vyhrazena.