Prosty sposób na spam w formularzach

Dlaczego NIE dla CAPTCHA i innych systemów antyspamowych?

Czasami mam problem z odczytem tekstu z obrazka podawanego przy wysyłaniu sms’a z darmowej bramki Orange. Na swoim blogu też miałem niekiedy problem odczytać z obrazków imiona bohaterów kreskówek, mimo, że sam je w nie wpisałem. Rozwiązanie Google? Bezładna plątanina literek nie ułatwia życia. Powoli dotarło do mnie to, że mimo sprawnej ochrony przed spamem, utrudnia to życie użytkownikowi danej strony WWW. Pewnego razu trafilem na teksty CAPTCHA – jak odróżnić złe od gorszych Kornela Lesińskiego oraz CAPTCHA nie dla ludzi Piotra Lewandowskiego, które to dobiły gwóżdź do trumny – zrezygnowałem z zabezpieczającego obrazka. Oczywiście, na blogu pojawiła się masa różnych komentarzy zostawionych przez spamujące boty. Coś trzeba było zrobić. W pierwszej chwili myśl padła na systemy antyspamowe, tj. Akismet czy Spam Karma. Mimo, że spełniają swoją rolę, jednak część „dobrych” komentarzy zostaje przez nie zjedzonych, a zdarza się, że coś „złego” jednak przejdzie. Postanowiłem stworzyć coś własnego w walce ze spamem.

Więc jak?

Miało być przede wszystkim prosto i skutecznie, bez wykorzystania JavaScript, grafik, a jednocześnie przezroczyste dla komentującego. W ciągu kilku dni przyszło mi do głowy kilka metod sprawdzanych przez ostatni miesiąc na widocznej tu instalacji systemu blogowego WordPress.

Metoda I – Zakomentowane Pole

Wstawiamy w formularz zakomentowane ukryte pole:
<!-- <input type="hidden" name="metoda1" value="1" /> -->
a następnie sprawdzamy, czy zmienna metoda1 jest przekazywana do skryptu parsującego nasze dane, jeżeli tak, to niech spam spada na drzewo, np.:

<?php
if( isset( $_POST['metoda1'] ) ) exit();
?>

Wydaje się banalnie proste, ale jak skuteczne! Na moim blogu opartym na WordPress wyłapuję ona ok 90-95% spamu! Boty parsują formularze, parsują ich pola, nie biorą pod uwagę, że niektóre z nich są komentarzami.

Metoda II – Ukryte Pole

Wstawiamy w formularz ukryte pole:
<input type="hidden" name="metoda2" value="1" />
a następnie sprawdzamy, czy zmienna metoda2 jest przekazywana do skryptu parsującego nasze dane, jeżeli nie, to niech spam spada na drzewo, np.:

<?php
if( !isset( $_POST['metoda2'] ) ) exit();
?>

Ta metoda przenaczona jest na boty spamujące raczej określone systemy, jak WordPress. Więc na boty, które przekazują do formularza tylko te dane, które są standardowo w formularzu. W zasadzie ta metoda wraz z powyższą dały mi w ciągu miesiąca prawie 100% skuteczność w zwalczniu spamu.

Metoda III – Wartość Submit

Nasz przycisk do zatwierdzenia formularza ma jakąś wartość, np:
<input name="submit" type="submit" id="submit" value="Zostaw komentarz" />
a więc sprawdźmy, czy zmienna submit po przekazaniu do skryptu parsującego dane z formularza ma wartość przez nas ustaloną, jeżeli nie, to niech spam spada na drzewo, np.:

<?php
if( !isset( $_POST['submit'] ) || $_POST['submit'] != 'Zostaw komentarz' )  exit();
?>

Niektóre boty przekazują własną wartość dla przycisku „submitującego” (zwykle jest to „yes” ;-), i to właśnie je powstrzyma ten kawałek kodu. Ale nie tylko, niektóre boty, przy więcej niż jednym formularzu na stronie, parsują je jako jeden. „Dziwnym” trafem dane wysyłają do skryptu parsującego dane z formularza umieszczonego jako pierwszy na stronie, a wartość przycisku „submit” z ostatniego formularza znajdującego się na stronie. Więc jeżeli tylko mamy różne wartości „submitów”, ta metoda też się sprawdzi (owszem, nasuwa się kolejna metoda, sprawdzanie czy tylko dane z konkretnego formularza są przesyłane, ale po co?).

Podsumowując

Opisane tu metody, w połączeniu razem dają mi jak narazie 100% skuteczność. Owszem, nie mogę być pewny, że nigdy mi żaden spam nie przejdzie, ale przypuszczam, że nawet w dalszej przyszłości będzie on wyjątkową rzadkością. Z drugiej strony metody te są banalne w zastosowaniu i mam pewność, że nie zjedzą mi żadnego „prawdziwego” komentarza ani w żaden sposób nie utrudnią życia użytkownikowi mojej strony.

I na koniec jeszcze jedna – Czasowa

W jednym z tekstów przytoczonych na początku warto zwrócić na komentarz Łukasza Więcka:

A ja jestem w trakcie testów innego posobu na spam. Metoda banalnie prosta – od momentu wyświetlenia strony do momentu wysłania napisanego komentarza musi minąć minimum 5sec. Narazie jest czysto, a w logach widzę juz kilkadziesiąt odrzuconych komentarzy (większość dodawana już po jednej sekundzie od wejścia na stronę).

ps.

Udało mi się spłodzić post z kolejną częścią mych zabaw w wyłapywanie spamu w formularzach.


28 Responses to “Prosty sposób na spam w formularzach”

  • mirekbia Says:

    Pewnie ze mozna tak . Czy da sie zablowac adresy IP np całe sieci z chin indii czy pakistanu zeby boty nie wchodzili. Zablokowalem juz 300 roznych adresow w tym cale sieci typu host , nie widac efektu. Zablokowane mam dziwne hosty na email a zdarzaja sie nawet polskie emaile typu *@amorek.pl . Watpie w swoja parace bo codziennie mam jeden adres zablokowany. Oczywiscie moge zrobic tak jak wszedzie kazdy wpis na rejestracje … ale chcialem sie upewnic.

  • wallace Says:

    Da się, Admin > Options > Discussion i w czarną listę wpisujesz np.: XXX.YYY.
    Nie wiem, ja nie mam problemu ze spamem w komentarzach, większość załatwiają te metody, to co przejdzie wyłapuje filtr Sblam.

  • Woto Says:

    A ja mam takie pytanie do was. Korzystam z skryptu forum miniBB i chcę zabezpieczyć formularz rejestracyjny. Czy prezentowane w tym artykule metody są odpowiednie? Czy raczej dotyczą tylko komentarzy, a nie formularza do zakładania nowego konta. Ewentualnie prosiłbym o podpowiedź jakiejś innej metody na ochronę przed zakładaniem kont przez spambooty. W razie czego proszę o przykłady kodów jak daną metodę mam wstawić do plików.

    P.S. Jeszcze mam inne pytanie, trochę nie w temacie, ale może ktoś pomoże. Czy jest możliwość indywidualnego dodania opcji „Powiadom emailem o nowych wątkach” w gotowym już skrypcie forum (gdzie brakuje tej opcji) i czy jest to dużo roboty?

  • wallace Says:

    Metody można podpiąć do każdego formularza. Co innych metod antyspamowych dla miniBB… poszukaj na forum społeczności.

  • gophi Says:

    Mam nadzieję że mnie nie wyspamuje za linka ;) Jakby ktoś potrzebował patcha na WordPress 2.5 wykorzystującego dwie opisane metody, to znajdzie go u mnie: http://www.chmurka.net/p/wordpress-2.5-comment-nospam.patch.gz – oczywiście należy zamienić w wp-comment-post.php mój adres e-mail na swój (można też kompletnie wyłączyć raportowanie odrzuconych komentarzy).

  • wallace Says:

    Dodaj jeszcze sprawdzanie kolejności zmiennych w $_POST – doda kilka, może nascie % skuteczności :-)

  • gophi Says:

    Zaczęli obchodzić. Zmieniłem dzisiaj nazwy pól (oraz w wp-comments-post.php) i kilka spamów jak na razie się złapało – wysyłają formularze z oryginalnymi nazwami pól.

  • gordon Says:

    zastosowałem te metody i niestety nie działają. Kiepskie rozwiązania