WP Math Captcha

W poprzedniej notce wspomniałem o rezygnacji z dotychczas używanego filtru anty-spamowego, a z powodu takiego, że mój devblog ciągle nawiedzają jakieś spam boty i zaśmiecają bazę niepotrzebnymi komentarzami-śmieciami, musiałem coś zaaplikować, coś co ich powstrzyma i zmniejszy ten, jakże paskudny, proceder.

W celu tym przejrzałem katalog wtyczek do WP pod etykietą spam oraz rozejrzałem się po sieci. Wtyczek do eliminacji spamu jest cała masa, ale po kilkunastu odechciało mi się kontynuacji tego procesu. Nic mi się nie podobało, nic nie zadawalało, więc zmuszony zostałem do tego, aby coś samemu wymyślić i stworzyć, coś bardzo prostego i przede wszystkim skutecznego.

Sposobów do walki ze spamem na WP jest bardzo dużo. Od prostych do wymyślnych. Jedne wymagają interakcji z użytkownikiem, inne działają całkiem automatycznie lub w ukryciu ;)

Ja szukałem prostego rozwiązania, które pozwoli mi odsiewać komentarze spamerów już na etapie dodawania komentarza, aby niepotrzebnie nie pakować śmieci do bazy danych. Wtyczki z różnymi metodami opartymi na captcha i obrazkami jakoś mnie nie zadowalały. Spodobało mi się za to idea oparta na tzw. math captcha, czyli proste działanie matematyczne do rozwiązania przez użytkownika, które pozwala określić czy dodający jest rozumną istotą. Rozwiązania takie widywałem na kilku blogach, m.in. u regedita i coldwinda.

Wiedząc już to czego dokładnie chcę, wystarczyło zabrać się do pracy. Po kilku minutach powstała pierwsza wersja wtyczki WP Math Captcha dostepnej na stronie projects.malcom.pl. Tam również znajduje się instrukcja instalacji, która ogranicza się do dodania w plikach szablonu, w formularzu komentarza wywołania jednej funkcji: wpmc_form_input.

Zasada jej działania jest bardzo prosta. Losujemy trzy cyfry i składamy z nich proste działanie matematyczne. Następnie do formularza dodawania komentarza dodajemy odpowiednie pole i treść samej operacji, której wynik użytkownik musi wyliczyć. Przy dodawaniu komentarza musimy w jakiś sposób sprawdzić podany wynik z tym prawidłowym, więc gdzieś trzeba przechować wynik do porównania. W naszej wtyczce jest on dołączany także do formularza, ale jako ukryte pole. Najprostszy sposób.

Oczywiście wynik nie jest jawny (w sensie liczbowy wynik) bo byłoby to zbyt proste i pewnie jakieś boty poradziliby sobie z tym lub dostosowały. Zatem do formularza dołączamy cokolwiek co nam pozwoli stwierdzić poprawność podanego wyniku, a innym na nic się nie przyda. Padło na funkcję skrótu z wyniku "posolonego" stringiem (solić będziemy w następnej wersji, bo zapomniałem dodać ;)). Powinno to być wystarczającym zabezpieczeniem.

W sumie niekoniecznie trzeba dodawać ten hash do formularza, a np. trzymać w zmiennych sesyjnych, bądź gdziekolwiek indziej.

Innym możliwym rozszerzeniem jest dodanie nieco automatyzacji. Za pomocą JavaScriptu można zminimalizować interakcję i wysiłek po stronie użytkownika. Prosta funkcja, ukrywająca pole do wpisywania math captcha wraz z ustawieniem wyliczonej wartości już po załadowaniu się strony. Użytkownicy z włączonym JS-em (czyli 99%) nie musieliby nic robić, jedynie pozostali zmuszeni byliby do wykonania tego prostego działania matematycznego. A spam botów z obsługą JS chyba jeszcze nie uświadczymy ;)

dodano 18/09/2009 @ 11:40

Nowa wersja z "soleniem" wyniku i statystykami, w postaci licznika zablokowanych komentarzy - funkcja wpmc_count. W przyszłości może wtyczka będzie posiadać jakieś opcje w PA, możliwość określenia czy blokować komentarze czy tylko oznaczać jako spam i automatyzację JSem.

dodano 20/09/2009 @ 14:42

Do tej pory wtyczka blokowała nie tylko komentarze bez prawidłowego wyniku, ale także całą inną aktywność dyskusyjną - ping/track- backi, o czym się wczoraj przekonałem przy zapisywaniu notatki.

Na szybko wypuściłem nowy release z poprawką, zalecana jest aktualizacja do wersji 0.3 ;)

6 thoughts on “WP Math Captcha”

  1. Dementuję pogłoskę jakoby nie było spambotów z obsługą JS. Osadzenie kontrolki Firefoxa czy IE to przecież żadna filozofia, za jednym zamachem jest zrobiona obsługa JS i parsowanie HTML do DOM.

    Z drobiazgów – tabulator nie pozwala wejść do wyniku działania.

  2. O wykorzystaniu kontrolki webowej nie pomyslalem, a daje to duzo mozliwosci i ulatwia tworcom prace.

    To juz nikt nie pisze 5-linijkowych perlowych botow?

    Trzeba w hardcodowac w wtyczce atrybut tabindex w polu input. W planach jest dodanie funkcji umozliwiajacej zastosowanie wlasnego formatu/stylu, aczkolwiek funkcja zwracajaca wygenerowane dane do „samodzielnego montazu” pol i labelow bedzie duzo lepszym rozwiazaniem, co ulatwi integracje z reszta szablonu.

  3. No wiadomo, odpowiednie narzedzia do odpowiednich celow. Na codzien tez zaczynam od import urllib ale czasem liczba ciasteczek, JS i innego szajsu jest tak duza ze szybciej jest odpalic VS z C# w virtualboxie.

  4. Zainstalowałem Twoja wtyczkę. Wygląda nieźle, zobaczymy jak się sprawdzi. Jedno zastrzeżenie – działanie wydaje mi się ZA TRUDNE. Da sie to jakoś uprościć? Np bez mnożenia?
    W kazdym razie dzięki.

  5. Poradziłem sobie. Wystarczyło usunąć z pliku wtyczki wartość $a i pozostał wynik dodawania. Teraz jest OK :)

  6. Wystarczy odpowiednio zmodyfikowac dzialanie (linie 69 i 70). Mozna dodac losowanie kolejnych cyfr i skladac rozne dzialania, od prostych po bardziej zlozone.

    W Twoim wypadku wystarczy usunac $a * i zostanie samo dodawanie ;)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *