Table of contents
W dzisiejszych czasach każda strona pozwalająca wysyłać komentarze musi liczyć się z atakiem spambotów i jakoś się przed nimi zabezpieczyć. Spam na WWW ma inne cele i ograniczenia niż spam rozsyłany przez e-mail i póki co istnieją proste i skuteczne sposoby do walki z nim.
Pomysły podane w tym artykule wcieliłem w życie, dodałem kilka bardziej zaawansowanych technik i wszystko to udostępniłem jako darmowy filtr antyspamowy.
Dlaczego nie CAPTCHA?
Bo koszt spamu ponosi niewinny użytkownik.
- Przeklepywanie liter jest drażniące i uciążliwe.
- Większość domorosłych autorów nie ma pojęcia o technikach OCR i robi obrazki nieczytele dla ludzi, a nie botów (np. niski kontrast, pstrokate kolory i rozstrzelone litery wcale botom nie przeszkadzają).
- Są barierą dla osób niewidomych, słabo widzących, a czasem nawet daltonistów.
CAPTCHA jest niezbędna jako zabezpieczenie przed profesjonalnymi spamerami, którzy mogą “zainwestować” grube pieniądze w zaspamowanie specyficznego serwisu (typu Google, Hotmail). Jeśli na zaspamowaniu twojej strony nie da się grubo zarobić, to masz luxus zabezpieczania się przed ogólnymi (głupimi, tanimi :) botami.
Dlaczego nie rejestracja?
Znów — fatyga dla użytkownika, a są boty, które potrafią automatycznie rejestrować się na forach, co wcale nie dziwi, bo wypełnienie formularza i otworzenie linku z e-mail to coś, co można zrobić nawet prostym skryptem PHP (rozszerzenie imap + curl).
Nie ma nad czym płakać, bo dzięki serwisom takim jak BugMeNot i Mailinator weryfikacja przez e-mail i tak zdewaluowała się.
To co zatem?
Są dwa popularne typy spambotów — spamujące linkami w celu podwyższenia PageRank oraz boty wykorzystujące lukę w komendzie mail() PHP. Zamiast robić różne voodoo wystarczy przyblokować dokładnie to, co jest niezbędne dla spamerów.
Linki
Wszystkie spamowe posty mają jedną fundamentalną wspólną cechę — linki do innych stron.
Rzadko kiedy ktoś w komentarzach podrzuca więcej, niż jeden-dwa linki, więc pierwszą obroną jest odrzucanie postów z dużą ilością linków. Wykrycie linków jest banalnie proste: wystarczy zliczyć ilość wystąpień “https://” i “https://”.
Posty, które zawierają dopuszczalną ilość linków (1-2?) można kolejkować do moderacji, sprawdzić jeszcze innymi metodami albo po prostu przepuszczać (póki spamerzy nie nauczą się wysyłać spamowych postów z małą ilością linków).
Posty bez linków nie są w ogóle interesujące dla tego typu spamerów.
(na stronach, gdzie dodałem takie banalne zabezpieczenie ilość spamowych postów spadła z ok. 40 dziennie do 2-3.)
Słowa kluczowe
Spamowanie linkami działa najlepiej, gdy post jest pełen słów kluczowych związanych z tematem spamu. Na szczęście te słowa kluczowe są przeznaczone dla bota Google, więc nie mogą być w żaden sposób ukrywane, bo by ich bot nie znalazł.
Wystarczy zebrać pare postów, żeby zorientować się jakie tabletki, dewiacje, gry hazardowe i oferty kredytowe są na topie. Rozpoznanie tych specyficznych słów pomaga zdecydować które posty z linkami są spamem (samo blokowanie słów to przesada, bo przecież ktoś mógłby się chwalić co wyprawiał po wygranej w kasynie ;)
Dziurawy mail()
Komenda mail() w PHP ma idiotycznie zaprojektowane dodawanie własnych nagłówków, które umożliwia rozsyłanie spamu z naiwnie napisanych formularzy kontaktowych.
Boty nie wiedzą, który formularz później używa mail(), więc ślą exploit gdzie popadnie. Odrzucaj posty pasujące do wyrażen regularnych “/Content-Type\s*:/i” lub “/Content-Transfer-Encoding\s*:/i” (BTW: w PHP zapomnij o ereg, używaj preg).
Odrzucaj też posty zawierające “\r\n” w imieniu osoby wysyłającej (nie da się tych znaków wstawić przez <input type=text>, więc można spokojnie założyć, że to bot).
Oczywiście jeśli używasz mail(), to filtruj dane od użytkownika — wycinaj znaki nowej linii (zarówno \r jak i \n) ze wszystkiego, co wrzucasz do nagłówków. W przeciwnym wypadku jeśli masz w kodzie coś podobnego:
$naglowki = "Reply-To: $imie <$email>";
to twój formularz może być wykorzystany do rozsyłania spamu — bot zamiast imienia albo e-mail dorzuci pare linijek nagłówków MIME, które wyślą kopię tego e-maila do innych osób, a nawet pozwolą dodać załączniki w HTML.
Inne pomysły
Jest ich wiele — polecam podsumowanie technik filtru Sblam!.
Uwagi
Gdy blokujesz posty — pisz dlaczego i nie banuj od razu. Opis przyczyny blokowania na nic nie zda się botom, ale gdyby post człowieka przypadkiem wpadł w filtr, to dasz możliwość ominięcia pomyłki filtru.
Co nie działa?
Skuteczność <a rel=nofollow> jest znikoma. Tracą na tym autorzy stron, do których użytkownicy naprawdę linkują, a takie oznaczenie linków i tak nie odstrasza spambotów — botom nie opłaca się sprawdzać, czy strona tak oznacza linki, bo to zajmuje tyle samo czasu, co po prostu wysłanie spamu.
Sprawdzanie HTTP_REFERER jest kompletnie, ale to absolutnie totalnie bez sensu. Botowi banalnie prosto jest spreparować ten nagłówek, a z drugiej strony jest on kłopotliwy dla prawdziwych użytkowników, którzy mogą mieć go wycinanego lub modyfikowanego przez przeglądarkę, firewall albo proxy. Podobnie z Cookies, User-Agent i innymi danymi z HTTP.
Ograniczanie ilości postów z danego IP. Spam może być słany z rozproszonego botnetu, może być słany w większych odstępach czasu przez całe dni i noce, a z drugiej strony możesz mieć grupy odwiedzających z jednego Proxy providera/sieci osiedlowej wieszających wszystkich na jednym IP.
Co zawsze działa?
Moderacja. Nie musi być uciążliwa — filtrami możesz sobie zminimalizować ilość rzeczy do moderowania i np. udostępnić sobie posty jako RSS/Atom, żeby tylko rzucać okiem, czy nie przedostały się jakieś spamy.