Walka ze spambotami

Największą plagą Internetu jest spam i to nie tylko ten w postaci e-maili. W przypadku aplikacji internetowych możemy się z nim spotkać wszędzie tam gdzie użytkownicy mają możliwość dodawania własnej treści do serwisu. Może to mieć miejsce w przypadku for internetowych czy komentarzy do treści zawartych na stronie.

W przypadku aplikacji internetowych zadaniem spamu jest wstawienie linków prowadzących do pozycjonowanego serwisu wszędzie tam gdzie jest to możliwe. Powodem takiego stanu rzeczy są wyszukiwarki internetowe. Zdecydowana większość z nich promuje strony na podstawie ilości linków, które do nich prowadzą.

Jak działają spamboty

Działanie spambotów można podzielić na dwa typy. Pierwszy odnosi się do spamowania konkretnej aplikacji (np. komentarzy systemu blogowego WordPress), drugi zaś jest bardziej uniwersalny i polega na spamowaniu każdego dostępnego formularza.

W pierwszym przypadku dane wysyłane są bezpośrednio pod adres odpowiadający za ich zapis. Nazwy zmiennych pobierane są z domyślnej instalacji, dodatkowo uwzględniane są ich najpopularniejsze odmiany. Przykładowo jeśli domyślna nazwa zmiennej odpowiadającej za nick użytkownika to login bot w celu lepszego działania może też uwzględnić popularne modyfikacje nazwy tej zmiennej np. username, nick, user.

<?php
  $url = 'http://wiadomosci.onet.pl/10,15,11,4040918,0,forum.html';
  $post = 'FormID=1187433833.3CA88848&TT=Test&TX=Testowa tresc&PD=testowy&OK';
 
  $ch = curl_init( );
  curl_setopt( $ch, CURLOPT_URL, $url );
  curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
  curl_setopt( $ch, CURLOPT_POST, 1 );
  curl_setopt( $ch, CURLOPT_POSTFIELDS, $post );
  curl_exec( $ch );
  curl_close( $ch );
?>

Opis: Przykładowy kod spamujący komentarz serwisu Onet.pl

Działanie uniwersalnych spambotów jest bardziej rozbudowane. Nie wysyłają one danych bezpośrednio do pliku odpowiedzialnego za zapis, ale parsują stronę w poszukiwaniu formularzy. Po ich znalezieniu wypełniają pola, które zawiera dany formularz, a następnie wysyłają go pod adres z parametru action znacznika <form />.

<?php
  $code = file_get_contents( 'adres' );
  preg_match( '#<form action="(.*?)"#', $code, $action );
  preg_match_all( '#<input name="(.*?)"#', $code, $inputs );
  
  foreach( $inputs[1] as $input )
  {
    $data .= $input . '=spam&';
  }
  
  file_get_contents( $action[1] . '?' . $data );
?>

Opis: Przykładowy kod spamujący odnaleziony formularz

Pomimo, że skuteczna walka ze spamem staje się coraz trudniejsza istnieją metody, które utrudniają spambotom pracę. Poniżej kilka przykładów jak radzić sobie z niechcianymi "gośćmi".Captcha

Obecnie najpopularniejszą metodą obrony przed spamem są obrazki z tokenami. Metoda ta jest skuteczna przy zastosowaniu różnorodności wyglądu obrazków. Przykładem stosunkowo dobrze stworzonego mechanizmu captcha jest ten wykorzystywany przez bramkę sms sieci Orange. Stosuje on różne kroje czcionki, pozycje wyświetlania tokenu, dodaje losowe szumy tła, a także jako token przyjmuje zamiast losowo wygenerowanego ciągu znaków wyrazy ze słownika.

Token z bramki Orange

Opis: Przykładowy token z bramki Orange

Mimo wysokiej skuteczności tej metody ma ona jedną znaczącą wadę. Utrudnia ona często dostęp nie tylko spambotom, ale także zwykłym użytkownikom. Dzieje się tak na skutek słabej czytelności tokenów oraz zbyt dużej inwazyjności – w końcu mamy utrudniać działanie botom, a nie użytkownikom.

Rozbudowany token ;-)

Opis: "Rozbudowany" token

Pomyśl

W przypadku captcha bot może zczytać kod analizując poszczególne pixele obrazka. Rozwiązaniem tego problemu jest odmiana poprzedniej metody, która zamiast przedstawiania tokenów graficznych zadaje użytkownikom pytania. Rodzaj pytań jest zależny od programisty tworzącego zabezpieczenie. Najczęściej spotykanymi pytaniami są pytania o stolice państwa oraz działania arytmetyczne.

Bardzo prosta wersja tej metody znajduje się na moim blogu. Aby dodać komentarz należy odpowiedzieć na pytanie czy jest się botem zaznaczając odpowiednie pole. Mimo prostoty działania oraz obejścia zabezpieczenia "uniwersalne boty" nie dają sobie z nim rady.

Tylko się rusz

Podczas dodawania treści do serwisu przez użytkowników możemy być pewni dwóch akcji – ruchu myszką oraz naciśnięcia klawisza. Wykorzystując te zdarzenia przy pomocy JavaScript możemy napisać kod, który skutecznie rozróżni użytkownika od bota. Wszystko dzięki temu, że bardzo mała liczba botów radzi sobie z tą technologią, a te które ją obsługują nie wykonają tych zdarzeń.

W przypadku "uniwersalnych robotów" po wykonaniu zdarzenia onkeypress lub onmousemove skrypt może podpiąć pod właściwość action formularza właściwy adres, pod który mają zostać wysłane dane. W celu obrony przed dedykowanymi botami można skorzystać np. z tokenów.

Inne

Prócz wyżej przedstawionych metod warto wspomnieć jeszcze o dwóch, które są proste do wdrożenia. Pierwszą z nich jest umieszczenie formularza wewnątrz ramki. Dzięki temu robot parsujący kod strony nie znajdzie w nim formularza. Drugim sposobem jest przesyłanie danych przy pomocy AJAXa.

Mimo, że techniki spamowania stają się coraz bardziej wyrafinowane istnieje wiele sposobów umożliwiających przed nim skuteczną obronę. Im bardziej technika jest innowacyjna i rzadziej stosowana tym większe daje szanse na skuteczne zablokowanie działania spambotów.

Tagi: spam captcha boty

Komentarze

  1. radex napisał(a): #1

    18.08.2007 21:21

    Nie zapomnij o systemach filtrujących, takich jak np. Sblam!, jednak to ma oczywiście wady, np. Konieczność oczekiwania na odpowiedź zewnętrznego serwera.

  2. Michał `Bełdzio` Ławicki napisał(a): #2

    18.08.2007 21:32

    O :-) nie znałem tego :-) systemy, o których wspomniałeś są dobrym rozwiązaniem, ale wg mnie lepiej zabezpieczyć się lokalnie. Szybciej działa i nie jesteśmy od nikogo zależni :) Jednakże warto się z nimi zapoznać :)

  3. ph napisał(a): #3

    18.08.2007 22:20

    Warto też wspomnieć o Project Honey Pot - projecthoneypot.org

    Jak się pozastawia do tego pułapki... A co ciekawe, z Polski jest sporo użytkowników tego projektu.

  4. marines napisał(a): #4

    19.08.2007 00:51

    IMO Akismet jest najmniej inwazyjnym systemem filtrującym spam

  5. cimlik napisał(a): #5

    19.08.2007 10:21

    Dobrym sposobem jest też użycie radiobuttona. Miałem o tym pisać, ale widzę, że używasz tego rozwiązania :).

  6. Slavo napisał(a): #6

    19.08.2007 14:51

    Akismet jest świetny, wyłapuje wszystko, ale ostatnio również komentarze tylko jednego "prawdziwego" użytkownika i nie mogę sobie poradzić z oduczeniem go tego.

  7. atb napisał(a): #7

    19.08.2007 19:44

    jakiś rok temu pisałem program do czytania tokenów na rapidshare
    w efekcie mogłem ustawić ściąganie całej listy plików na noc (jeszcze neostrada sie restartowala, zeby zmienic ip)
    potem rapidshare zmienił tokeny (i ciągle je zmienia...), a mi sie znudziło ciągłe aktualizowanie programu. nie udało mi się nigdy napisać bardziej uniwersalnego ocra... ale jak sie chce, to z powodzeniem można coś napisać, ale tylko pod konkretny system
    wciąż mam skrzynke zaspamowaną "pytaniami o UAD" xD

  8. Michał `Bełdzio` Ławicki napisał(a): #8

    20.08.2007 13:18

    Ostatnio jeszcze widziałem jeden ciekawy sposób :)

    Spamboty wrzucają txt we wszystkie pola formularza, możemy to wykorzystać umieszczając ukryte pole, a następnie po submicie spr. czy jest ono wypełnione :)

  9. Hash napisał(a): #9

    20.08.2007 14:37

    Oczywiście Bełdzio, można ukryć jedno pole, ale zapewne co mądrzejsze boty unikają inputów z właściwością hidden. Wszak wiele serwisów korzysta z ukrytych pól w celu weryfikacji przeznaczenia formularza, np:
    <input type="hidden" name="post-id" value="283" />
    ;)

  10. Hash napisał(a): #10

    20.08.2007 14:39

    kontynuując (bo wcięło, zrób coś z tym):
    Wszak wiele serwisów korzysta z ukrytych pól w celu weryfikacji przeznaczenia formularza, np:
    [code]<input type="hidden" name="post-id" value="333" />[/code]
    Boty unieszkodliwiłyby same siebie ;)

  11. Michał `Bełdzio` Ławicki napisał(a): #11

    20.08.2007 15:34

    a co powiesz na:


    <input name="cos" class="cos" />

    .cos{
    display: none;
    }


    ?? :-)

  12. radex napisał(a): #12

    21.08.2007 20:29

    dobry pomysł ;) ciekawe jak w praktyce się to wykonuje... może dla pewności dać width i height na 0?

  13. Michał `Bełdzio` Ławicki napisał(a): #13

    21.08.2007 20:38

    Nie :-) styl css załatwi wszystko :)

  14. Hash napisał(a): #14

    22.08.2007 17:16

    No cóż, a gdy wyłączę css to mi się strona rozjedzie ;) Ale intencja dobra :)

  15. Michał `Bełdzio` Ławicki napisał(a): #15

    22.08.2007 17:21

    czemu rozjedzie? pojawi się tylko dodatkowy input :-)

  16. karol napisał(a): #16

    26.08.2007 14:54

    ciekawy artykul o captcha mozna przeczytac na tej stronie: http://pornel.net/captcha

  17. bronx306 napisał(a): #17

    23.09.2007 21:15

    mam problem czy moglibyscie mi pomoc obronic sie przed botami na forum. codziennie przybywa mi duzo spamu i zarejestrowanych botow, musze usuwac. wytlumaczycie mi co mam zrobic zeby sobie z tym poradzic?? plece zgory thx

  18. Michał "Bełdzio" Ławicki napisał(a): #18

    23.09.2007 21:20

    jaki silnik forum?

  19. bronx306 napisał(a): #19

    24.09.2007 17:05

    php przemo

  20. Michał "Bełdzio" Ławicki napisał(a): #20

    24.09.2007 20:15

    Rzuć okiem na to http://www.goldenline.pl/forum/programisci-www/129331

  21. intruder2600 napisał(a): #21

    25.09.2007 23:41

    Ale jedna kwestia jezeli chodzi o pola input: narazie jest ich malo wiec nie oplaca sie pisac spambotow, ktore zaznaczaja odpowiednie pole, jezeli bedzie ich na tyle duzo, ze bedzie to oplacalne bedzie to duzo latwiejsze do zlamania niz token. Latwiejsze bo bot ma szanse 1/3 lub 1/5 (jak jest 5 inputow) ze trafi, metoda brute force, czyli zaznaczanie na "chybil - trafil" sprawdzi sie tutaj idelnie, jest to tylko kwestia czasu, czasu ktory wg mnie nie przkroczy minuty - zaleznie od szybkosci serwera :)

  22. Michał "Bełdzio" Ławicki napisał(a): #22

    25.09.2007 23:51

    Metoda z inputami jest przeznaczona dla uniwersalnych botów, które spamują wszystkie dostępne formularze i w tym przypadku sprawdza się przyzwoicie :)

  23. mirekbia napisał(a): #23

    27.12.2007 15:46

    My jesteśmy z Polski. Nasze adresy IP (hosty) nie sa az tak liczne. Szukam teraz w sieci google, jakies informacji ktore adresy, cale maski, hosty zablokować zeby przynajmniej ograniczyc 90% spamu. Wiem ze mozna ograniczyc Tokenami ale czy cos da wyeliminowanie adresow z chin japoni Korea indonezji itp. Jestem przeciwnikiem rejestracji . Chcesz dodac komentarz to musisz sie rejestrowac czekac na email na niektorych jeszcze jest tak ze od rejestracji musisz czekac dwa dni od zalozenia konta zeby dac linka i dotego trzeba dac najpierw dwa posty bez linków.

    Specjalnie jedno zalozylem i tak sie z nimi bawie ze blokuje ich hosty zablokowalem juz ok 300 roznych (od domeny na email hosta czy lub IPz* Czy mi sie uda ?

  24. potreb napisał(a): #24

    17.01.2008 00:11

    A co myślicie o zabezpieczeniu forma np tym:
    Wpisz sume 2+2 =

  25. Michał "Bełdzio" Ławicki napisał(a): #25

    17.01.2008 06:24

    Lepsze niż nic, aczkolwiek proste do sparsowania :-)

  26. jack napisał(a): #26

    2.02.2008 22:48

    a jak dam że nie wiem czy jestem botem to co?? proste działania matematyczne są dobrym zabespieczeniem :)

  27. hehh napisał(a): #27

    19.03.2008 07:58

    a jak dam że nie wiem czy jestem botem to co?? proste działania matematyczne są dobrym zabespieczeniem :)

  28. Michał "Bełdzio" Ławicki napisał(a): #28

    19.03.2008 12:06

    Jak dasz nie wiem to tak samo jakbyś dał tak :-) Proste działania matematyczne są proste do złamania :-)

  29. savan napisał(a): #29

    4.08.2008 22:28

    generalnie puste pole dobrze się sprawdza.
    przykładowo:

    <style>
    .puste-pole{visibility:hidden;}
    .puste-pole input{width:1px;}
    </style>
    <span class="puste-pole">
    <input type="text" value="" name="puste" />
    </span>


    style to wiadomo gdzie, a cały span można dać obok innego inputa, bo jest wąski.

    Unikałbym stylu {display:none;}

    pozdrawiam :)

  30. DiLu napisał(a): #30

    5.08.2008 11:30

    Skoro jest Challenge-response, to można użyć też pustego pola z opisem "Pozostaw to pole puste, by dodać komentarz". Bardzo dobry sposób na nowatorskie rozwiązania gdy, na przykład, w komentarzu nie ma strony www, wtedy takie antyspamowe pole można nazwać po prostu www :-) Bot na pewno je wypełni.
    P.S. Nie wiem, czy ktoś to wykorzystuje, ale wymyśliłem to przed chwilą :-D

  31. var1at napisał(a): #31

    2.09.2008 10:41

    mi się najbardziej podoba rozbudowany token z akademickiego forum :)
    zastanawiam się ilu potencjalnych internautów którzy nie potrafią policzyć tej granicy zakończyło swoją przygodę z tym forum :D

Skomentuj

Dozwolone tagi: a, strong, em, code, blockquote

Nick (wymagany)

E-mail (na potrzeby graviatar'a):

Jesteś botem?

Komentarz: