Aplikacje internetowe

Bełdziowe spojrzenie na aplikacje internetowe

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.

Przykładowy token z bramki Orange

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

"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: , ,
Kategoria: Bezpieczeństwo, Bezpieczeństwo aplikacji internetowych


31 komentarzy

  1. radex napisał(a):

    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):

    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. 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):

    IMO Akismet jest najmniej inwazyjnym systemem filtrującym spam

  5. cimlik napisał(a):

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

  6. Slavo napisał(a):

    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. 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):

    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):

    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):

    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):

    a co powiesz na:


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

    .cos{
    display: none;
    }

    ?? :-)

  12. radex napisał(a):

    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):

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

  14. Hash napisał(a):

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

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

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

  16. karol napisał(a):

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

  17. bronx306 napisał(a):

    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):

    jaki silnik forum?

  19. bronx306 napisał(a):

    php przemo

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

    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):

    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):

    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):

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

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

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

  26. jack napisał(a):

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

  27. hehh napisał(a):

    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):

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

  29. savan napisał(a):

    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):

    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):

    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

Dodaj komentarz