Jeszcze do niedawna problem spamu na stronach internetowych praktycznie nie istniał. Od około 2003 roku książki gości, fora dyskusyjne i komentarze zaroiły się od reklam viagry, xanaxu oraz innych towarów. Jak sobie z tym radzić?

Wstęp

Jeszcze do niedawna problem spamu na stronach internetowych praktycznie nie istniał. Co prawda działały „żniwiarki”, czyli programy wyłuskujące niezabezpieczone adresy email (w postaci login@serwer.pl), ale ich działanie pozostawało niewidoczne. Około 2002 lub 2003 roku pojawiły się wyspecjalizowane programy oraz skrypty, których głównym zadaniem jest znalezienie na stronie wszystkich formularzy, uzupełnieniem ich treściami reklamowymi i wysłaniem na serwer. Od tej chwili książki gości, fora dyskusyjne i komentarze zaroiły się od reklam viagry, xanaxu oraz innych towarów. Od tego czasu ludzie walczą z tą plagą wymyślając nowe lub adaptując stare rozwiązania.

Sposoby

Ze sposobów walki ze spamem wymienić można m.in:

  • ręczne zatwierdzenie każdego nowego wpisu
  • prośbę o tekst z kodu obrazkowego
  • prośbę o wynik równania matematycznego
  • automatyczny mechanizm oceniający treść

Pierwszy sposób jest najłatwiejszy w realizacji, jednak przy większym ruchu (zwłaszcza botów) jest bardzo kłopotliwy. Kody obrazkowe wydawały się być dobrym rozwiązaniem, ale ich realizacja na wielu stronach okazała się być tragiczna. Niestety większość tych obrazków jest łatwa do odczytania jedynie przez boty, a nie przez ludzi. Równanie matematyczne jest skuteczne, zwłaszcza w połączeniu ze słowami: „Podaj wynik działania: 2 + cztery” . Najbardziej skomplikowanym rozwiązaniem jest mechanizm oceniający treść. Wymaga on znajomości zagadnień związanych z probabilistyką oraz kilku sztuczek pozwalających uzyskać dużą wydajność.

W sieci dostępne są gotowe rozwiązania pozwalające walczyć ze spamem. Wśród nich wymienić można: Akismet, BadBehaviour lub polski Sblam!.

Naiwny filtr bayesowski

Działanie filtru można opisać następującymi wzorami:

antyspam

gdzie:

L – liczba grup wiadomości

N – liczba słów, na podstawie których oceniana jest wiadomość

frqi1 – częstotliwość wystąpień słowa i w grupie 1 oznaczonej jako spam

frqij – częstotliwość wystąpień słowa i w grupie j

Tabele

Do działania filtru potrzebne będzie skonstruowanie magazynu, który będzie przechowywać słownik oraz dodatkowe informacje (typu liczba powtórzeń, częstotliwość występowania, itd.). Tabele mogą wyglądać następująco:

antyspam_grupy – id (int autoincrement) | nazwa (varchar 10) | liczba (int)

klucze: id – primary key

antyspam_słowa – słowo (varchar 30) | liczba (int) | grupa (int) | frq (float) | czas (timestamp on update currenttimestamp)

klucze: słowo + grupa – unique ; czas

Tabela antyspam_grupy będzie zawierać informacje o grupach, do których można przypisać poszczególne wiadomości. Liczba grup jest nieograniczona, ale zbyt duża ich liczba może sprawiać problemy przy określaniu rodzaju wiadomości. W przedstawionym przykładzie przyjęte zostało, że są tylko dwie grupy: „spam” oraz „dobre”. Kolumna liczba będzie zawierać liczbę wiadomości przypisanych do tej grupy.

Tabela antyspam_slowa to tabela zawierająca słownik. Ustawiony unikalny indeks na kolumny słowo i grupa pozwoli w prosty sposób aktualizować informacje o liczbie wystąpień danego słowa (można użyć w zapytaniu do bazy „on duplicate key update”).  Kolumna liczba będzie wskazywać ilość powtórzeń danego słowa w podanej grupie. Natomiast kolumna frq to częstotliwość wystąpień danego słowa (jest liczona jako: antyspam_slowa.liczba/antyspam_grupy.liczba przy warunku antyspam_slowa.grupa = antyspam_grupy.id). Częstotliwość ta posłuży do określenia oceny danego słowa. Ostatnią kolumną jest czas. Kolumna ta może być użyta do określenia słów, które od dawna nie pojawiały się w wiadomościach i które mogą zostać usunięte z bazy. Oczywiście słowa z grupy „dobre” powinny pozostać nietknięte. Czyszczenie tabeli pozwoli pozbyć się słów, które przestały być używane przez spamboty.

Działanie

Po odebraniu danych z formularza tworzymy listę słów do sprawdzenia. Najlepiej zamienić wszystkie znaki interpunkcyjne na spacje, a następnie rozbić tekst na pojedyncze słowa przy pomocy funkcji explode. Dobrze jest też usunąć słowa, których długość nie mieści się w przedziale 5-25. Z uzyskanej listy słów losujemy słowa, na podstawie których dokonana zostanie ocena wiadomości. Wystarczy np. 20 słów wziętych równomiernie  z tekstu (tak, aby pojawiały się słowa z początku, rozwinięcia i zakończenia). Wylosowane słowa przekazujemy do bazy, która odsyła liczbę powtórzeń oraz częstotliwość wystąpień tych słów. Jeżeli jakieś słowo pojawiło się we wszystkich grupach mniej niż 4 razy, to przypisujemy mu ocenę cząstkową równą 0,4. W przeciwnym wypadku wyliczamy jego wartość ze wzoru na składnik. Po wyliczeniu wartości każdego słowa dokonujemy oceny wiadomości stosując wzór na ocenę. Tu warto zwrócić uwagę na to, że wartość słowa wynosząca 0 lub 1 ma ogromny wpływ na wartość wyrażenia. Dla 0 otrzymamy wynik = 0, nawet gdy reszta słów będzie typowo reklamowa. W przypadku 1 wynik przyjmie wartość 1. Dlatego też najkorzystniej będzie zmienić skrajne wartości na 0,01 oraz 0,99 (lub 0,1 i 0,9). Na koniec pozostaje jedynie sama kwestia oceny. Początkowo niewielka liczba słów będzie generowała ocenę równą 40%. Po dłuższej pracy oceny zaczną być bardziej różnorodne. Można przyjąć, że dla oceny do 20% wiadomość jest dobra, a powyżej 80% jest zła. Pośrodku przedziału występować będą wiadomości, co do których nie można wyciągnąć rozstrzygających wniosków. Jeśli wiadomość zostanie oznaczona jako dobra, to można ją zapisać do bazy (lub wysłać emailem). W przypadku wykrycia reklamy na stronie pokazujemy stosowny komunikat. Natomiast wiadomości niepewne wysyłamy tak jak dobre, ale dodajemy do nich informację o niejednoznaczności oraz link do ręcznej oceny.

Pajączek.pl - twórz poprawiaj publikuj

Tryby pracy

Filtr może pracować w kilku trybach. Początkowo lista słów jest pusta, więc filtr będzie pracować w trybie ręcznym. W trybie tym należy przekazać do oceny możliwie dużą liczbę wiadomości (tych dobrych i tych złych), aby system uzyskał odpowiedni zestaw słów. Etap ten może potrzebować do 100 wiadomości (po 50 z każdej grupy). Filtr zawierający odpowiedni zestaw słów można przełączyć w tryb automatyczny. W trybie tym będzie on jedynie oceniać wiadomości. Jest jeszcze jeden sposób działania systemu: tryb automatyczny z uczeniem. Każdą wiadomość, która została przypisana do określonej grupy, rozbijamy na pojedyncze słowa i przekazujemy do słownika z ustawionym id grupy. Dzięki temu filtr może uczyć się samodzielnie nowych słów. Jednakże w tym trybie tkwi potencjalny problem. Po źle sklasyfikowanej wiadomości słowa trafią do niewłaściwej grupy. Kolejne tego typu wiadomości rozregulują słownik tak, że nie będzie on w stanie prawidłowo oceniać treści. Dobrze jest kontrolować poczynania systemu i sprawdzać jakie słowa zostały ostatnio dodane/zmodyfikowane (tutaj przyda się kolumna data). W razie nieprawidłowej klasyfikacji należy zmienić ręcznie klasyfikację wiadomości (dzielimy wiadomość na słowa, odejmujemy je z listy słów w błędnej grupie, dodajemy je do listy słów w dobrej grupie, przeliczamy częstotliwość występowania).

Tuning i rozszerzenie możliwości

Filtr nie jest doskonały. Przy małej liczbie słów będzie przepuszczać reklamy zawierające słowa składające się z losowych znaków (ocena 40%). Ta niedoskonałość zostanie zniwelowana po odpowiednio długiej pracy. Pozwoli to uzupełnić słownik „dobrych” słów. Zmieniamy wtedy domyślną ocenę słów występujących mniej niż 4 razy z 0,4 na 0,8. Ocena samej treści to nie wszystko. System filtrujący rozszerzony może być o dodatkowe filtry sprawdzające takie informacje jak liczbę adresów url, występowanie kodu BB (jeśli nie stosujesz tego kodu, to pojawienie się [url, [link, [img może świadczyć o typowo reklamowej treści), ocenę ip nadawcy (przy pomocy http:bl) itd.

Dodatkowe filtry mogą być dołączone tak, aby ich oceny brane były z określoną wagą:

Ocena ważona

gdzie:

W – liczba filtrów = liczba wag

Filtry mające największy wpływ na ocenę wiadomości będą miały odpowiednio większe wagi. Przy filtrach „stawiających kropkę nad i” wagi będą mniejsze.

Ocena wiadomości pod kątem adresu IP może być czasochłonna, a w najgorszym wypadku będzie kończyć się przekroczeniem czasu wykonania skryptu. Dlatego też dobrze jest podłączyć ten filtr do wiadomości, które nie uzyskały rozstrzygającej klasyfikacji.

Linki

http://sblam.com/

http://www.paulgraham.com/spam.html

http://www.projecthoneypot.org/search_ip.php

http://www.projecthoneypot.org/httpbl_implementations.php

http://akismet.com/

http://www.bad-behavior.ioerror.us/