wizytówka internetowa
Rozwój internetu nieustannie zmierza w stronę większego nacisku na treści tworzone przez samych użytkowników. Udostępnianie co raz to nowszych narzędzi odwiedzającym witryny, umożliwiających im współudział w zawartości serwisu, niesie jednak za sobą poważne zagrożenie - podatność na SPAM. Jak się przed tym bronić?
Wojciech Kocjan
Z problemem spamowania - poprzez wypełnianie wszelkiego rodzaju formularzy internetowych - webmasterzy mają do czynienia od stosunkowo niedługiego okresu czasu. Wszystko rozpoczęło się kilka lat temu od prymitywnych form spamu, polegających najczęściej na zasypywaniu ksiąg gości wpisami reklamowymi, nie mającymi nic wspólnego z odwiedzaną stroną. Właściciele witryn, chcąc zwiększyć ich popularność oraz tzw. link popularity (wskaźnik ważny dla wyszukiwarek), często osobiście odwiedzali wszelkiego rodzaju księgi gości, w których zostawiali tego typu wpisy.
Skuteczność takich rozwiązań skłoniła spamerów do stałego rozwoju stosowanych technik. Dzisiejsze "ataki" są o wiele bardziej zaawansowane, wykonywane przez specjalnie do tego celu napisane oprogramowanie. Profesjonalnie przygotowane roboty internetowe automatycznie odwiedzają i bombardują wpisami już nie tylko księgi gości, ale także blogi, fora dyskusyjne, formularze kontaktowe, systemy wiki czy całe aplikacje CMS (Content Management System). Z problemem tym spotkał się zapewne nie tylko każdy webmaster i administrator serwera, ale także zwykły użytkownik, dla którego niektóre komentarze czy posty na forach mogły wydawać się niezrozumiałe.
Ataki botów spamerskich, w zależności od celu, jaki chce osiągnąć agresor, możemy podzielić na dwie podstawowe grupy: podwyższające wskaźnik link popularity witryny, bądź wysyłające "tradycyjny" spam pocztowy, poprzez luki w oprogramowaniu. Groźny jest zwłaszcza ten drugi typ, kiedy to nasze konto służy spamerom np. do wysłania kilkudziesięciu tysięcy niechcianych wiadomości - może to spowodować trafienie adresu IP serwera na tzw. czarne listy (Realtime Block List, RBL) i w konsekwencji - paraliż poczty wychodzącej.
Każda forma spamu niesie za sobą także inne problemy, pośród których wyróżnić możemy znaczne zwiększenie zużycia transferu (boty pobierające wszelkie pliki z naszej witryny mogą spowodować przekroczenie limitu transferu i tym samym zablokowanie konta), stratę czasu na moderację i usuwanie niechcianych komentarzy oraz obecność dziwnych treści, które dla nieświadomych użytkowników mogą okazać się problematyczne (również poprzez np. linki do zawirusowanych plików).
W walce ze spamerami nie jesteśmy na szczęście bezbronni, istnieje szereg działań, które możemy podjąć, aby w bardzo poważnym stopniu ilość spamu ograniczyć.
Najłatwiejszym do wprowadzenia - ale z pewnością nie najlepszym - sposobem walki ze spambotami jest wyłączenie bądź ograniczenie funkcjonalności, powodującej problem. Możemy to wprowadzić np. poprzez zablokowanie możliwości komentowania wpisów czy wymuszenie konieczności rejestracji użytkownika, zanim ten będzie mógł pisać na forum. Są to jedynie półśrodki do osiągnięcia celu, zwłaszcza, że roboty spamerskie są już tak wyrafinowane, że potrafią założyć konto na forum, potwierdzić rejestrację poprzez kliknięcie w link z wiadomości e-mail, a następnie zalogować się i dodawać nowe posty. Oczywistym z kolei jest, iż wyłączenie możliwości pisania na forum dla wszystkich użytkowników jest zupełnie pozbawione sensu, stąd też konieczność stosowania innych rozwiązań.
Jednym z podstawowych sposobów walki ze spamem w komentarzach czy wszelkiego rodzaju treściach, dodawanych przez użytkowników, jest moderacja. Może ona przybierać różne formy - moderowane mogą być poszczególne wpisy, konta użytkowników (aktywowane przez administratorów, po stwierdzeniu poprawności danych), czy też rozwiązania pośrednie - wpisy nowych użytkowników umieszczane są po zatwierdzeniu, a zarejestrowanych i potwierdzonych gości - od razu. Choć moderacja nie jest rozwiązaniem doskonałym - wymaga stale działania człowieka, który zatwierdza wpisy, poza tym jest mocno problematyczna przy dużej ilości dodawanych treści - to często stanowi ona podstawę działania wszelkiego rodzaju mechanizmów obronnych. Optymalnym rozwiązaniem jest połączenie moderacji z szeregiem innych modułów filtru antyspamowego, dzięki czemu to właściciel strony zawsze ma ostateczny głos w sprawie klasyfikacji treści jako (nie)pożądanej.
Każdy poważny system antyspamowy powinien mieć możliwość korygowania jego działania, poprzez decyzje człowieka, który najlepiej jest w stanie rozwiać wszelkie wątpliwości w sprawie rodzaju i charakteru dodawanych treści. Ostatecznym celem działania filtrów antyspamowych powinno być więc nie tyle całkowite wyeliminowanie spamu (gdyż jest to niemożliwe, zwłaszcza bez błędnego blokowania treści poprawnych), lecz znaczne jego ograniczenie (na poziomie >90%) i przekazanie wątpliwości do oceny przez człowieka. Dokonanie "odsiewu" treści, co do których jesteśmy pewni, że są spamem, możemy dokonać dzięki analizie zachowania botów i danych, przez nich dodawanych, a także sprawdzeniu, czy odwiedzający witrynę jest człowiekiem, a nie botem.
Metoda ta stanowi pierwszą ścianę obronną przed wszelkiego rodzaju niepożądanymi odwiedzinami robotów internetowych, nie tylko spamujących, ale również zbierających adresy e-mail czy przeprowadzających ataki, wykorzystując dziurawe oprogramowanie. Zasada działania tego typu filtrów polega na analizie wysyłanych przez odwiedzającego żądań HTTP i ich porównaniu ze znanymi, "normalnymi" schematami działania popularnych przeglądarek, używanych przez zwykłych użytkowników.
Zasada działania podstawowych filtrów polega na sprawdzaniu takich nagłówków jak HTTP_REFERER czy USER_AGENT, jednak co raz bardziej wyszukane narzędzia spamerów potrafią się bardzo dobrze podszywać pod zwykłego użytkownika, przez co konieczne jest zastosowanie bardziej zaawansowanych mechanizmów obronnych. Napisanie samemu skutecznego filtru na poziomie nagłówków HTTP wymaga sporej wiedzy i dużego doświadczenia w administracji serwisami internetowymi, dlatego dobrym rozwiązaniem jest sięgnięcie po gotową aplikację.
Na uwagę zasługuje tu zestaw skryptów PHP o nazwie "Bad Behavior", stale rozwijany od 2005 roku i dostępny na licencji GNU GPL. Podstawowa instalacja tego systemu sprowadza się do dodania jednej linii kodu, nie są więc wymagane żadne zaawansowane umiejętności, aby tego dokonać. Istnieją również gotowe wtyczki (tzw. "connectors"), pozwalające na łatwą integrację "Bad Behavior" z popularnymi aplikacjami, takimi jak Drupal, Joomla, WordPress czy MediaWiki.
"Bad Behavior" działa na poziomie nagłówków HTTP, blokując wysyłanie jakichkolwiek danych do końcowego użytkownika, jeśli ten rozpoznany jest jako niepożądany bot. Niesie to za sobą wiele zalet, pośród których warto wyróżnić oszczędność transferu jak i fakt, że bot nie będzie mógł ze strony wyłuskać żadnego adresu e-mail - jedyne co zobaczy, to komunikat błędu (4xx). Łatwość instalacji i skuteczność tej aplikacji powoduje, iż stanowi ona znakomitą pierwszą linię obrony, nie tylko przed spamem, ale także przed wieloma innymi, popularnymi atakami na systemy internetowe. "BB" nie dotyczy bowiem samego spamu, lecz skupia się na metodach, za pomocą których tego typu ataki są przeprowadzane.
Opisywane rozwiązanie jest bardzo podobne do modułu Apache o nazwie "mod_security", z tą różnicą, że w przypadku "Bad Behavior" nie potrzebujemy dostępu do konfiguracji serwera, co zazwyczaj ma miejsce jedynie w przypadku serwerów dedykowanych i kolokacji.
Istotnym aspektem, w przypadku rozwiązań działających przy nawiązywaniu komunikacji z przeglądarką, jest niewielki margines błędu, na jaki można sobie pozwolić. Wyobraźmy sobie sytuację, że zablokowane zostanie wysłanie strony do prawidłowego, normalnego użytkownika - nie zobaczy on w ogóle witryny, nie znajdzie adresu kontaktowego do nas i tak naprawdę będzie myślał, że strona po prostu nie działa. Są to sytuacje bardzo mocno niepożądane, na szczęście autor "Bad Behavior" zapewnia, że mają one miejsce bardzo rzadko, a jeśli już do nich dojdzie - służy on swoją pomocą w zlokalizowaniu i usunięciu problemu.
Najczęściej stosowanym zabezpieczeniem przed formularzowym spamem jest analiza treści, które zostały przez niego przesłane do serwera. Jest to krok absolutnie niezbędny, brak jakiejkolwiek weryfikacji danych pochodzących z formularzy jest niedopuszczalny i stanowi podstawowy błąd początkujących programistów.
Zasadnicze aspekty, które powinny ulec sprawdzeniu, to długość i typ wpisanych przez użytkownika treści. Możemy być pewni, że coś jest nie tak, jeśli np. w polu "Autor" wysłano ciąg 1000 znaków czy w polu "Wiek" podano adres URL. Dokonanie podstawowej kontroli tego typu jest sprawą bardzo prostą, w PHP możemy jej dokonać używając funkcji strlen() oraz wyrażeń regularnych.
W przypadku projektowania formularzy kontaktowych, przy budowie których używana jest funkcja mail(), należy zadbać o dodatkowe operacje kontrolne. Bardzo często w formularzach widnieje np. pole "Adres e-mail nadawcy", którego zawartość jest dołączana w czwartym argumencie funkcji mail(), w postaci 'Reply-to: '.$nadawca.'. Jest to rozwiązanie niebezpieczne, pozwalające napastnikowi na dodanie dowolnych nagłówków, poprzez odpowiednie spreparowanie zawartości pola z adresem e-mail nadawcy - wystarczy np. dodać kilkaset nagłówków BCC (ukryte kopie), ażeby wykorzystać serwer do wysyłki spamu. Jak się przed tym zabezpieczać? Poza określeniem maksymalnych długości pól, warto sprawdzić występowanie w nich takich nagłówków jak "Content-Type", "MIME-Version", "BCC" czy "Content-Transfer-Encoding". Przykładowa funkcja wykonująca takie sprawdzenie pokazana jest w ramce poniżej.
function checkField($field) {
$badTags=array('MIME-Version','BCC',
'Content-Transfer-Encoding',
'MIME format', 'Content-Type');
foreach ($badTags as $badTag) {
if (stristr($field,$badTag)) {
return false;
}
}
return true;
}
Skutecznym rozwiązaniem w walce ze spamem linkowym jest zastosowanie filtru, wyłapującego podejrzane słowa i frazy. Większość spamu reklamuje tak naprawdę grupę tych samych produktów czy usług, po krótkiej analizie jesteśmy wiec w stanie określić listę słów, które są potencjalnie niebezpieczne. Pojawia się tutaj jednak problem z aktualizacją tego typu filtrów - bez stałego uzupełniania ich o nowe frazy, będą się one stawały co raz bardziej zawodne.
Na szczęście, istnieją rozwiązania, które pozwolą nam w pełni zautomatyzować tę czynność, oferując przy tym szereg innych usług dodanych. Na uwagę zasługują zwłaszcza dwa: Akismet oraz Sblam. Zasada działania w obu przypadkach jest bardzo podobna - właściciel witryny umieszcza na niej kilka linii kodu, które powodują przekazanie danych wysłanych przez formularz do centralnego serwera, udostępnianego przez twórców aplikacji. Przeprowadzana jest tutaj dokładna analiza treści w oparciu o liczne testy, po czym do witryny zwracany jest wynik określający czy wiadomość jest spamem czy nie. Zalet takiego rozwiązania jest przynajmniej kilka - najważniejsze z nich to z pewnością łatwość instalacji i fakt, że właściciel strony nie musi się martwić o aktualizacje filtrów i wymyślanie co raz to nowszych zabezpieczeń - wystarczy raz zainstalować system i można spać spokojnie. Dodatkowym atutem jest fakt, iż dokładne zasady działania stosowanych filtrów antyspamowych nie są dostępne publicznie - dzięki czemu spamerom ciężej jest je obejść.
<?php
$WordPressAPIKey = 'aoeu1aoue';
$URL = 'http://www.adres.strony.pl/';
$akismet = new Akismet($URL ,$APIKey);
$akismet->setCommentAuthor($name);
$akismet->setCommentAuthorEmail($email);
$akismet->setCommentAuthorURL($url);
$akismet->setCommentContent($comment);
$akismet->setPermalink('http://adres.strony.pl/wpis10/');
if(!$akismet->isCommentSpam())
// dodanie komentarza
}
?>
Akismet jak i Sblam wykonuje szereg testów, wśród których jednym ze skuteczniejszych jest zliczanie liczby linków, istniejących w przesłanej treści. Stosowane są również czarne listy spamerów, a do jednej z najciekawszych funkcjonalności należy sprawdzanie pochodzenia (na podstawie adresu IP) autora wpisu - sytuacja, w której na polskiej stronie dodawanych jest mnóstwo komentarzy np. z Chin jest bowiem bardzo podejrzana. Ciekawych wniosków może dostarczyć również analiza godziny, w której komentarz czy post został napisany. Jak widać, zakres przeprowadzanych testów jest bardzo szeroki, co gwarantuje wysoką skuteczność działania. Fakt przetwarzania danych na zewnętrznym serwerze ma jednak i wady: wydłuża czas analizy, która - wg autora Sblam - trwa średnio około 2 sekundy oraz jest nieskuteczna w momencie awarii centralnego serwera.
Trzecia grupa mechanizmów antyspamowych przerzuca dużą część działania na użytkownika, który zobligowany jest do udowodnienia, że jest człowiekiem, a nie bezmyślnym robotem. Najpowszechniej stosowanym rozwiązaniem jest CAPTCHA (Completely Automated Public Turing Test to Tell Computers and Humans Apart), które jest formą zautomatyzowanego testu Turinga, pozwalającego określić zdolność maszyny do myślenia w sposób podobny do ludzkiego. W przypadku witryn www, do odfiltrowania botów stosuje się kilka losowych znaków, umieszczonych w postaci graficznej, często na specjalnie do tego celu przystosowanym tle, które ma utrudniać odczytanie liter. Zadaniem użytkownika jest bowiem przepisanie wyświetlanych znaków w dodatkowe pole formularza - jeśli nie zrobi tego prawidłowo, traktowany jest jako bot, co skutkuje niemożnością rejestracji czy dodania postu/komentarza.
Popularność CAPTCHA nie jest do końca zrozumiała, gdyż tak naprawdę jest to jedno z najgorszych rozwiązań - jest uciążliwe dla użytkowników, którzy sami mają często trudności z odczytaniem tekstu, zwłaszcza dla osób niewidomych czy mających wszelkiego rodzaju problemy ze wzrokiem. Dodatkowym czynnikiem, przemawiającym za niestosowaniem tego typu mechanizmów jest fakt, że zostały już wielokrotnie złamane, dzięki zastosowaniu oprogramowania OCR (Optical Character Recognition) - przykładem jest zabezpieczenie stosowane przez phpBB, które boty spamerskie skrzętnie omijają. Innym problemem jest niemożność użycia tego zabezpieczenia przy przesyłaniu track- i pingbacków, które w technologii blogowej są często używane.
Zważywszy na powyższe wady rozwiązania CAPTCHA, od pewnego czasu popularność zdobywają nieco ich zmodyfikowane wersje. Na uwagę zasługują takie skrypty jak "Did You Pass Math?" czy "Math Comment Spam Protection" - w formularzu dodaje się jedno pole tekstowe, w które użytkownik musi wpisać wynik prostego działania matematycznego, przykładowo "2+7". Nie wydaje się jednak, aby to rozwiązanie pozostało skuteczne na dłużej - wprowadzenie go do popularnej aplikacji z pewnością nie przyniosło by oczekiwanych efektów.

Mimo, iż metody działania spamerów są co raz bardziej wyrafinowane, właściciele witryn nie stoją w walce z wszędobylskim spamem na straconej pozycji. Spamerzy najczęściej wykorzystują naiwność i nieświadomość webmasterów, którzy rzadko kiedy decydują się na jakiekolwiek zabezpieczenia. Istnieją skuteczne metody obrony, jednak ich popularność jest zadziwiająco niska - przyczyn należy szukać także w dostępnej literaturze informatycznej, która - niestety - bardzo rzadko podejmuje ten temat.
Jakie zabezpieczenia antyspamowe stosować? Najlepszym rozwiązaniem będzie wybór i integracja dwóch aplikacji: zastosowanie połączenia "Bad Behavior" i "Sblam" powinno zablokować ~99% spamu - to wszystko przy bardzo niskim nakładzie sił, ograniczającym się do dodaniu kilku linii kodu. Warto przy tym pamiętać o poprawnym użyciu funkcji mail() i dbaniu o bieżące aktualizacje popularnego oprogramowania, takiego jak systemy CMS czy fora dyskusyjne.
Jeden z najpopularniejszych na świecie systemów, broniących przed spamem z formularzy. Działa w oparciu o sieć serwerów, na których przetwarzane są dane pochodzące od użytkowników. Akismet jest ściśle związany z witryną wordpress.com - aby uzyskać niezbędny klucz API, należy założyć darmowe konto w tymże serwisie.
Akismet bardzo łatwo integruje się nie tylko z blogiem opartym o WordPress, istnieje też szereg wtyczek do popularnych aplikacji, takich jak Drupal, PostNuke, phpBB czy punBB. Dużą zaletę stanowi obecność gotowych klas napisanych w wielu językach, dzięki czemu funkcjonalność Akismetu możemy zapewnić w praktycznie dowolnej aplikacji, napisanej w języku PHP 4/5, Python, Ruby, Java, Perl czy technologii .NET.
Wszelkie dane wysyłane z naszego serwisu do Akismetu trzymane są na serwerach przez 15 dni - przez ten czas możemy zająć się wyłapaniem ew. błędów w działaniu systemu.
Do użytku prywatnego Akismet jest w pełni darmowy, ceny wersji komercyjnych zaczynają się od 5$ miesięcznie. Wedle statystyk, umieszczonych na stronie głównej aplikacji, Akismet zablokował już blisko 2 miliardy treści spamerskich, wskaźnik ten rośnie o minimum kilka milionów dziennie - 95% przetwarzanych danych jest bowiem spamem.
Działa na podobnej zasadzie co Akismet, na uwagę zasługuje jednak fakt, iż jest to projekt polski - a więc dostosowany do rodzimych stron. System jest darmowy (także dla witryn komercyjnych), wymaga jednak obsługi języka PHP. Instalacja nie powinna przysporzyć problemu nawet początkującemu programiście, dostępne są też wtyczki do phpBB i Wordpress.
Sporym atutem jest dobra dokumentacja, opisująca sposób działania skryptu i przeprowadzane testy, wśród których znajdują się m.in. białe/czarne listy, lista słów/fraz/linków z automatycznie uczącym się filtrem statystycznym, integracja z zewn. bazami: Spamhaus, SURBL i LinkSleeve czy stosowanie technik JavaScript. Zastosowane rozwiązania pozwoliły na osiągnięcie imponującej skuteczności na poziomie 99,8%.
Po wyrobieniu darmowego klucza API, uzyskujemy dostęp do statystyk działania skryptu.
Popularna wtyczka do systemu blogowego WordPress, bezpłatna do użytku prywatnego. Charakteryzuje się łatwą instalacją (aktywacja wtyczki z poziomu panelu administracyjnego) i modułową budową. Oferuje podobne możliwości do Akismetu/Sblam, jednak wszelkie testy wykonywane są lokalnie - sami decydujemy, które moduły mają być włączone, mamy też wgląd w ich kod źródłowy.
Spośród wielu modułów na uwagę zasługują „Encrypted Payload” oraz „Stopwatch”, które badają czas, jaki upłynął od wyświetlenia strony do dodania komentarza - jeśli jest zbyt krótki, następuje zablokowanie dodanego komentarza. Wśród pozostałych opcji znajdziemy m.in. możliwość włączenia CAPTCHA i integracji z Akismetem.