OKblog

Jak porazit spam

Pondělí, 20. srpna 2012 15.24 Blog

To už tady dlouho nebylo – našli si mě spammeři. Tedy spíš objevili můj blog a komentáře. Naposledy to bylo kdysi dávno, asi před pěti lety. Tehdy jsem to vyřešil jednoduchým antispamem, kdy uživatel musel doplnit jednoduchý příklad (1+1). Ten odolával v podstatě až doteď.

Začalo to asi před měsícem. Denně přibývalo až deset spamů. Než jsem je smazal, všechny údaje jsem zapisoval, abych přišel na nějaký systém. Zkoumání ale nic zajímavého nepřineslo. Zjistil jsem jen toto:

Na zkoušku jsem zablokoval komentáře z IE6, ale to nepomohlo – identifikace se najednou změnila na Firefox. Napsal jsem o spamu na facebookovou stránku a dostal jsem pár rad, za které děkuji. Teď se pokusím sepsat, jak jsem to vlastně vyřešil.

Skryté pole

Základem je klasické formulářové pole. Všimněte si, že ve value má nastavenou hodnotu. Může to být libovolné číslo, řetězec, cokoliv. Nezáleží na tom.


  <input type="text" name="antispam" value="12345" />

Pole skryjeme pomocí CSS:


  input[name="antispam"] { display: none; }

A teď přichází ta chytrá část. Dá se předpokládat, že spambot nebude umět JavaScript. Proto pomocí jQuery (není nutné, stačí jen JS) smažu hodnotu value:


  $(document).ready(function() {
$("input[name=antispam]").val("");
});

Serverovým skriptem pak zakážu komentář, když je pole vyplněno. (Uvádím příklad v ASP.)


  <%
If Not Request.Form("antispam") = "" Then
Response.End
End If
%>

A takhle nějak to funguje. Možná to není úplně nejlepší řešení, ale zdá se, že funguje. A má to další plus – zbavil jsem se starého způsobu ochrany, takže už není třeba zadávat výsledek příkladu.

předchozí další


Související články

Komentáře (15)

 
pondělí, 20. srpna 2012 16:24:20

Chápu to dobře, že když mám na mobilu vypnuté JS tak budu v podstatě chápán jako spambot a nepůjde mi odeslat komentář? Já byl nedávno také bombardovanej přes můj kontaktní formulář. IP pocházelo někde z Ruska. Naštěstí stačilo doplnit jednu krátkou kontrolní otázku a je po problémech.

PS: Koukám, že dnes mají blogeři pré. Tohle je třetí blog, který má dnes nový článek, co jsem zatím zpozoroval :).

 
pondělí, 20. srpna 2012 16:49:47

Na svém webu jsem řešil obdobnou situaci – taky začali chodit boti (XP, IE) a psát komenty. Nechtěl jsem ale captchu tak jsem udělal taky skrytý (prázdný) input. Slyšel jsem že boti se snaží všechny inputy vyplňovat, takže pokud ten input má nějakou hodnotu tak jde o bota, pokud nemá jde o člověka. Funguje to parádně a návštěvník nemusí mít povolený JS.

 
pondělí, 20. srpna 2012 17:20:46

[2] Tesy: To jsem chtěl slyšet, díky. Naštěstí jsou boti hloupý takže dokud to tak bude, nebude to zas taková dřina. Na ten mail, co mi chodilo také vyplňoval všechny políčka (URL na nějaký web) tak stačila kontrolní otázka a bot je v háji.

 
pondělí, 20. srpna 2012 17:25:26

[1] Carl114: Bohužel, je to tak. Zatím nevím, jak to vyřešit. Kontrolní otázka přestala fungovat, tenhle spambot je asi chytřejší.

[2] Tesy: To jsem zkoušel, bez výsledku. Docela mi vadí, že tím můžu některé omezovat, ale co se dá dělat…

 
pondělí, 20. srpna 2012 18:43:28

[4] xergic: Co zkusit náhodné generování kontrolní otázky? Na vybrali.sme.sk se takhle točí dokola několik otázek. Když je uděláš jednoduché (aby to neotravovalo) tak to snad žádný bot nemůže prorazit. Já si teda nedokážu představit jak by to dokázal :).

 
pondělí, 20. srpna 2012 22:12:19

[5] Carl114: Zvažoval jsem to, ale nejradši bych uživatele neotravoval vůbec. Teď jde o to, co je větší zlo. Zatím to asi nechám takhle.

 
pondělí, 20. srpna 2012 22:15:30

[6] xergic: Tak udělej že pokud uživatel nemá zapnutý JS tak bude muset vyplnit captchu/otázku.

 
úterý, 21. srpna 2012 21:17:44

Osobně tohle na blogu řeším tak, že komentář uložím do DB s příznakem „spam“ a na zadaný e-mail (pokud splňuje určité podmínky) pošlu ověřovací odkaz – po návštěvě odkazu se příznak „spam“ odstraní.

Zatím žádný bot touhle obranou neprošel, navíc to znemožňuje krádež identity. Chystám se tuhle metodu ještě lehce vylepšit, ale základ určitě měnit nebudu – funguje skvěle.

 
středa, 22. srpna 2012 11:20:41

[8] Dash: Nápad dobrý, ale jako uživatele by mě to asi odradilo. Přijde mi to o dost otravnější než kontrolní otázka.

 
středa, 22. srpna 2012 12:40:38

A co, když ten robot odesílá ten spam někde odpryč a posílá tedy dotazy jen na soubor s tím skriptem, co komentáře odesílá?

Na svém blogu mám třeba, že když je komentář odeslán jen voláním souboru submit-comment tak se neodešle. Návštěvník zkrátka musí být na webu a napsat to tam.

Rozumíš mi? Mohl bych ti ten HTAccess kód poslat. Třeba to pomůže. Mě nechodí nic.

 
středa, 22. srpna 2012 13:57:12

[10] Carl114: To právě nemůže. V kódu je skryté pole s hashem, který se skriptem kontroluje. Myslel jsem na to.

 
středa, 22. srpna 2012 15:52:50

[11] xergic: Tak jsem v koncích :). Ale jestli to nakonec nějak uděláš, určitě o tom napiš. Tak hodně štěstí.

 
středa, 22. srpna 2012 19:35:23

[12] Carl114: Tak to současné řešení zatím podle všeho funguje, jen mě trochu mrzí, že to nefunguje bez JS. Ale to ještě budu řešit.

 
čtvrtek, 23. srpna 2012 13:53:27

Stejný způsob ochrany pro WP má myslím Raven's antispam. Vynikající věc, žádný opisování kódu nebo počítání a vynikající úspěšnost. Akorát nedávno mi vyskočily další 3 spam komentáře…

 
sobota, 1. září 2012 18:53:48

Já jsem spam ochranu na svém blogu vyřešil, tak, že jsem hodil hidden input s value, kde mám aktuální (time()*325)/223 a jelikož nikdo nedokáže napsat komentář do dvou vteřin (robot jo) tak kontroluji změnu
if($_POST['nacteno']*23)/325)+2)>=$datum)
a kdo je moc pomalý, tak ještě kontroluji také delší čas
if(($datum-(($_POST['nacteno']*23)/325))>=7200)
S tím, že když překročí některý z času, tak ho na to po odeslaní upozorním, ať odešle komentář znovu po dvou vteřinách.

A proč tak složité time()? Protože jsem někde četl, že roboti radí přičítají do valut čísla, takhle když přičte, tak se čas může změnit o roky :-D

K tomuto článku již není možné přidávat komentáře.