Prosty sposób na spam w formularzach

Dlaczego NIE dla CAPTCHA i innych systemów antyspamowych?

Czasami mam problem z odczytem tekstu z obrazka podawanego przy wysyłaniu sms’a z darmowej bramki Orange. Na swoim blogu też miałem niekiedy problem odczytać z obrazków imiona bohaterów kreskówek, mimo, że sam je w nie wpisałem. Rozwiązanie Google? Bezładna plątanina literek nie ułatwia życia. Powoli dotarło do mnie to, że mimo sprawnej ochrony przed spamem, utrudnia to życie użytkownikowi danej strony WWW. Pewnego razu trafilem na teksty CAPTCHA – jak odróżnić złe od gorszych Kornela Lesińskiego oraz CAPTCHA nie dla ludzi Piotra Lewandowskiego, które to dobiły gwóżdź do trumny – zrezygnowałem z zabezpieczającego obrazka. Oczywiście, na blogu pojawiła się masa różnych komentarzy zostawionych przez spamujące boty. Coś trzeba było zrobić. W pierwszej chwili myśl padła na systemy antyspamowe, tj. Akismet czy Spam Karma. Mimo, że spełniają swoją rolę, jednak część „dobrych” komentarzy zostaje przez nie zjedzonych, a zdarza się, że coś „złego” jednak przejdzie. Postanowiłem stworzyć coś własnego w walce ze spamem.

Więc jak?

Miało być przede wszystkim prosto i skutecznie, bez wykorzystania JavaScript, grafik, a jednocześnie przezroczyste dla komentującego. W ciągu kilku dni przyszło mi do głowy kilka metod sprawdzanych przez ostatni miesiąc na widocznej tu instalacji systemu blogowego WordPress.

Metoda I – Zakomentowane Pole

Wstawiamy w formularz zakomentowane ukryte pole:
<!-- <input type="hidden" name="metoda1" value="1" /> -->
a następnie sprawdzamy, czy zmienna metoda1 jest przekazywana do skryptu parsującego nasze dane, jeżeli tak, to niech spam spada na drzewo, np.:

<?php
if( isset( $_POST['metoda1'] ) ) exit();
?>

Wydaje się banalnie proste, ale jak skuteczne! Na moim blogu opartym na WordPress wyłapuję ona ok 90-95% spamu! Boty parsują formularze, parsują ich pola, nie biorą pod uwagę, że niektóre z nich są komentarzami.

Metoda II – Ukryte Pole

Wstawiamy w formularz ukryte pole:
<input type="hidden" name="metoda2" value="1" />
a następnie sprawdzamy, czy zmienna metoda2 jest przekazywana do skryptu parsującego nasze dane, jeżeli nie, to niech spam spada na drzewo, np.:

<?php
if( !isset( $_POST['metoda2'] ) ) exit();
?>

Ta metoda przenaczona jest na boty spamujące raczej określone systemy, jak WordPress. Więc na boty, które przekazują do formularza tylko te dane, które są standardowo w formularzu. W zasadzie ta metoda wraz z powyższą dały mi w ciągu miesiąca prawie 100% skuteczność w zwalczniu spamu.

Metoda III – Wartość Submit

Nasz przycisk do zatwierdzenia formularza ma jakąś wartość, np:
<input name="submit" type="submit" id="submit" value="Zostaw komentarz" />
a więc sprawdźmy, czy zmienna submit po przekazaniu do skryptu parsującego dane z formularza ma wartość przez nas ustaloną, jeżeli nie, to niech spam spada na drzewo, np.:

<?php
if( !isset( $_POST['submit'] ) || $_POST['submit'] != 'Zostaw komentarz' )  exit();
?>

Niektóre boty przekazują własną wartość dla przycisku „submitującego” (zwykle jest to „yes” ;-), i to właśnie je powstrzyma ten kawałek kodu. Ale nie tylko, niektóre boty, przy więcej niż jednym formularzu na stronie, parsują je jako jeden. „Dziwnym” trafem dane wysyłają do skryptu parsującego dane z formularza umieszczonego jako pierwszy na stronie, a wartość przycisku „submit” z ostatniego formularza znajdującego się na stronie. Więc jeżeli tylko mamy różne wartości „submitów”, ta metoda też się sprawdzi (owszem, nasuwa się kolejna metoda, sprawdzanie czy tylko dane z konkretnego formularza są przesyłane, ale po co?).

Podsumowując

Opisane tu metody, w połączeniu razem dają mi jak narazie 100% skuteczność. Owszem, nie mogę być pewny, że nigdy mi żaden spam nie przejdzie, ale przypuszczam, że nawet w dalszej przyszłości będzie on wyjątkową rzadkością. Z drugiej strony metody te są banalne w zastosowaniu i mam pewność, że nie zjedzą mi żadnego „prawdziwego” komentarza ani w żaden sposób nie utrudnią życia użytkownikowi mojej strony.

I na koniec jeszcze jedna – Czasowa

W jednym z tekstów przytoczonych na początku warto zwrócić na komentarz Łukasza Więcka:

A ja jestem w trakcie testów innego posobu na spam. Metoda banalnie prosta – od momentu wyświetlenia strony do momentu wysłania napisanego komentarza musi minąć minimum 5sec. Narazie jest czysto, a w logach widzę juz kilkadziesiąt odrzuconych komentarzy (większość dodawana już po jednej sekundzie od wejścia na stronę).

ps.

Udało mi się spłodzić post z kolejną częścią mych zabaw w wyłapywanie spamu w formularzach.


28 Responses to “Prosty sposób na spam w formularzach”

  • Piotr Lewandowski Says:

    Znam jeszcze prostszą metodę na ochronę przed spamem w komentarzach: nie zakładać bloga :D

  • DoktorNo Says:

    Ja zastosowłem inną metodę:

    Robimy w formularzu ukryte pole:

    Tuż po nim zmieniamy jego pustą zawartość małym skrypcikiem JS:

    //

    Boty nie obsługują JavaScriptu, więc zostawiają to pole nietknięte. Reszta nie wymaga komentarza, od czasu gdy to zastosowałem nie mam spamu. :)

  • WaLLacE Says:

    Też dobre :)
    Tylko właśnie, mimo że praktycznie wszyscy użytkownicy mają włączoną obsługę JavaScriptu, chciałem użyć metody całkowicie niezależnej.

  • DoktorNo Says:

    O rety, wycieło mi kod… :(

  • WaLLacE Says:

    Ale można się domyślić ;-)

  • Yax Says:

    Miałem podobny problem na forum(phpBB :(), gdzie dziennie potrafiło się rejestrować około 20-30 botów. Napisałem prosty skrypt generujący pytanie w stylu „czternaście dodać trzy” Odpowiedz trzeba podac w formie liczbowej. Od momentu dodania skryptu nie zjawił się już żaden bot :]

  • DoktorNo Says:

    Rozwiązanie równie dobre, ale, niestety wymaga od usera fatygi.

  • TJK Says:

    Genialnie prosty sposób, zastosowałem i po tygodniu stwierdzam 100% skuteczności :)

    Pozdrawiam

  • DoktorNo Says:

    TJK: mój czy autora tego bloga? ;)

  • xardas Says:

    Wymyśliłem lepszy sposób, który zdaje się działać ;-)
    Tworzymy 2 pola typu RADIO:
    Jesteś spambotem: [0/Nie] [1/Tak]
    Zaznaczamy pole z ‚Nie’ jako checked/selected. I to wszystko co musimy zrobić. Jeśli dostaniemy z tego pola wartość 1 -> jest to bot. Sprawdziłem, bot zawsze wysyła 1 w takim przypadku ;-)
    Ufam, że się to przyda.

  • WaLLacE Says:

    xardas: Sposób od dawna znany ;p Kwestia pytania/odpowiedzi. Bardzo podobny do „matematycznego” (opisanego powyżej w komentarzu Yaxa). Wymaga ingerencji użytkownika, więc dla mnie odpada.
    TJK: No ja niestety nie mam 100%, ale te kilka na miesiąć, które przejdzie powyższe metody, łapane jest na zbyt dużą ilość linków w sobie.

  • TJK Says:

    Niestety, WaLLacE, masz rację. Po drugim tygodniu testu muszę stwierdzić, że skuteczność spadła. Przez zaporę :) zaczeły przechodzić jeden-dwa wpisy dziennie, szczególnie na jednej podstronie. Innych jeszcze pewnie nie zindeksował.
    Teraz testuję metodę z Java Script. Mały skrypcik zmienia wartość ukrytego pola z formularza. Jeżeli wartość się zmienia to znaczy, że jest „ludzki” wpis. Jeśli wartość się nie zmienia, to spam morze spadać.
    Mam nadzieję, że jeszcze żaden bot nie interpretuje Javy. Niestety dla tych co mają wyłączoną obsługę Java Script jest to jest pewna uciążliwość. Na razie dla nich pojawia się komunikat i muszą włączyć tą obsługę.
    Myślę jeszcze o założeniu sieci na boty i blokowaniu niechcianych gości.
    Jak tylko znajdę więcej czasu to pokombinuję.

    Pozdrawiam

  • DoktorNo Says:

    Hmm, a może by tak tym się zainteresować?

    http://spam.geekhood.net/

  • WaLLacE Says:

    DoktorNo: Od trzech dni testowo tutaj Sblam! chodzi i jak narazie 100% skuteczności, żadnych pomyłek.

  • gophi Says:

    Wymaganie od użytkownika włączenia JS nie jest dobrym pomysłem. Wiele osób z różnych względów wyłącza JS, są też przeglądarki, które w ogóle nie obsługują JS (nie jestem pewien, ale chyba Opera Mini, której używam w telefonie, nie obsługuje – nie przeszkadza mi to, bo nie potrzebuję do niczego JS). Rozwiązanie antyspamowe nie może utrudniać życia ludziom, powinno być niezależne od przeglądarki.

    Opisany w artykule sposób z ukrytym polem jest ciekawy, ciekawe tylko kiedy boty nauczą się parsować htmlowe komentarze…

  • WaLLacE Says:

    Niestety umieją już dawno, ale tylko wybrańcy ;-) Na oko metoda I i II wyłapuje obecnie jakieś 95% spamu. Te co przechodzą, to widać jak na dłoni, dwa rodzaje botów. Pierwszy wstawia teksty (po ang.) „bardzo/fajna/dobra strona. Dzięki.”, oraz nick jest zawsze taki sam jak początek adresu www. Drugi wstawia masę słów związanych z tematem xxx. W zasadzie można by je dość prosto wyeliminować, ale to by były rozwiązania konkretnie pod te dwa boty, a myślę nad czymś ogólniejszym.
    ps. O ile dobrze pamiętam, gubiły się one przy większej ilości formularzy na stronie. A nawiązując dalej do tematu, ostatnio widziałem sposób, w którym gość wstawia cztery ukryte (CSS display:none) formularze na stronie, po dwa przed i po tym prawdziwym. Huh… to już bardziej ludzkie jest chyba użycie JS ;-)

    ps2. Opera Mini w pewnym stopniu obsługuje JavaScript (-:

  • Papatka Says:

    Nie wiem o co chodzi!!!:(:(:(:(

  • xardas Says:

    @Wallace „Wymaga ingerencji użytkownika, więc dla mnie odpada.”
    Nie. Domyślnie zaznaczona jest odp 0, której zmieniać nie trzeba. Czytaj ze zrozumieniem :)
    Przepraszam, że odkopałem. :P

  • WaLLacE Says:

    Rzeczywiście, nie do końca zrozumiałem co przeczytałem/napisałeś ;)
    W sumie ciekawe, jeszcze można ukryć w stylach takie coś. Hmm, i wszystkie boty się mylą? W wolnej chwili przetestuje :)

  • Obroń się przed spamem : zielony blogger pl Says:

    [...] bloga i mogą zniechęcić do komentowania. WaLLacE na swoim blogu opisuje własne, niestandardowe sposoby walki ze spamem, dosyć ciekawe i mające zastosowanie nie tylko na blogach, ale wymagające jednak przy ich [...]