Table of contents

  1. Antyspam
    1. Dlaczego nie CAPTCHA?
    2. Dlaczego nie rejestracja?
    3. To co zatem?
      1. Linki
      2. Dziurawy mail()
      3. Inne pomysły
    4. Uwagi
    5. Co nie działa?
    6. Co zawsze działa?

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 zaawan­sowa­nych tech­nik i wszystko to udostęp­ni­łem jako dar­mowy filtr anty­spamowy.

Dlaczego nie CAPTCHA?

Bo koszt spamu ponosi niewinny użytkownik.

OG7c czy 061e?

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.