Ochrana formulářů proti spamu
Pokud je na stránkách formulář, který slouží pro odesílání informací e-mailem, je potřeba ho zabezpečit proti e-mailovému spamu. Pokud se text z formuláře někde zobrazuje, je oblíbeným terčem tzv. komentářových spamerů. Ti spamují proto, aby se na webu objevil odkaz na jejich stránky. Pokud bude odkaz aktivní a zvýší jim tedy PageRank, tím lépe, ale spokojí se i s prostým zobrazením odkazu, který si třeba také někdo ručně otevře. Proto je neodradí zvýrazňování odkazů s využitím rel="nofollow", jejich nezvýrazňování, ani dodatečné mazání těchto komentářů a je potřeba se proti nim bránit jinak. Jednu primitivní metodu ochrany formulářů proti komentářovému spamu už jsem ukazoval, doba nicméně pokročila, spameři se zdokonalili a jednoduché metody obrany už nezabírají. Mezi ty mohlo patřit schválení příspěvku po přesměrování ze stránky pro uložení, generování náhodného řetězce a jeho ukládání do session proměnné nebo kontrola příliš rychlého nebo naopak pomalého odeslání formuláře.
V současnosti je asi nejoblíbenější chtít po uživateli zadat odpověď na jednoduchou otázku a protože se roboti ještě nenaučili zpracovat JavaScript, tak tuto odpověď za uživatele automaticky vyplnit a otázku skrýt. Skrývání se obvykle dělá pomocí stylu, jednodušší na vytvoření a použitelnější pro lidi s vypnutými styly je ale využít značku <noscript>:
<noscript><p>Vyplňte nospam: <input name="robot" size="6" /></p></noscript>
<script type="text/javascript">
document.write('<input type="hidden" name="robot" value="no' + 'spam" />');
</script>
Před uložením formuláře pak stačí ověřit hodnotu formulářového pole robot. Otázka samozřejmě může být složitější nebo pro každého uživatele jiná, např. nějaká početní operace, princip ale zůstává stejný.
Touto metodou se dá proti současným robotům efektivně bránit a plnohodnotná obrázková CAPTCHA by tak byla potřeba pouze v případě, kdy by se naše stránky stávaly cílem specializovaného útoku. Ale je potřeba pamatovat na to, že i řada obrázků se dá přečíst automaticky.
Diskuse
kahi:
Milý článek, zvlášť když jsem řešení stejného problému věnoval předchozí hodinu, a výsledkem bylo řešení podobné Vašemu, jen o poznání méně elegantní. Přesto díky :-).
dgx:
Rozhodně doporučuji pole nenazývat "robot", ale nejlépe třeba "email".
Pavel:
Díky určitě využiju, protože doteď tam mám ať uživatel napíši nějakou číslici 0-9, ale tohle se mi zda alegantnější. DíkyPachollini:
Osobně se mi osvědčil keyword blacklist. Nejúčinnější pro filtrování se mi jeví "<a href=" a "[url". Lidi takovou pitomost do formuláře, který to evidnentě nepodporuje, nikdy nenapíšou.
Jakub Vrána
:
Problém je v tom, že roboti obvykle zkouší i zadání prostého URL bez jakýchkoliv značek.
Peter:
Ja som to tak odfiltroval a spam chodi stale .. uz nie s www adresami ale s obycajnym sprostym textom ...rony:
ja doporucujem zamerat sa aj na TAG FORM. Akonahle ho skryjes, tak robot ho nevidi a ani sa nepokusa odosielat formularove data.adrive:
Môžeš dať príklad, ako tag form skryť? Či obdobným trikom noscript, script, document.write?mrzout:
Nevim jestli to tak bylo puvodne zamysleno, ale ...Samotny FORM by mohl byt do stranek pridan javascriptem ci Ajaxem ->coz ovsem odstrihne od moznosti prispivat vsem, kdo ho ma vypnut.
adrive:
no akonahle by bol form skrytý takýmto spôsobom, bolo by to vsetko jedno. pretoze v tagoch noscript by bol daný "odkrytý"Kája:
Tak mrzout tuším na značku noscript nějak nemyslel, spíš zavedl něco jako nulovou toleranci k uživatelům vypínajících JavaScript. :-)
Jakub Vrána
:
Pro fanoušky norem by se slušelo zmínit ještě dvě věci. Čekal jsem, až to někdo nakousne v komentářích, ale zatím se nikdo neozval...
1. V XHTML se nemá používat document.write(): http://www.w3.org/MarkUp/2004/xhtml-faq#docwrite. Jako náhradu lze použít document.createElement() a následné appendChild().
2. Vnitřek značky <script> by měl být kvůli zpětné kompatibilitě uzavřen do HTML komentářů (http://www.w3.org/TR/html4/interact/scripts.html#h-18.3.2), ty ale čisté XML parsery mohou zahazovat (http://www.w3.org/TR/xhtml1/#C_4), proto je lepší značku <script> používat výhradně s atributem src.
taui:
tohle se dela uplne bezne a myslim ze s tim neni problem:/*<
