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, ani nie zadawalało, wiec musiałem cos samemu wymyślić, coś bardzo prostego.

Sposobów do walki ze spamem na WP jest bardzo dużo, prostych i 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 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 rozwiązanie oparte na 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ż czego 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ż instrukcja instalacji, która ogranicza się do dodania w plikach szablonu, w formularzu komentarza wywołania funkcji wpmc_form_input.

Zasada jej działania jest bardzo prosta, losujemy trzy cyfry i składamy z nich proste działanie matematyczne. A następnie do formularza dodawania komentarza dodajemy odpowiednie pole i treść samej operacji do wyliczenia przez użytkownika. Przy dodawaniu komentarza musimy w jakiś sposób sprawdzić wyliczony wynik z tym prawidłowym, wiec 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 nam stwierdzić poprawność podanego wyniku, a innym na nic się nie przyda. Padło na funkcje 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 można byłoby wartość tego hasha nie koniecznie dodawać do formularza, a np. trzymać w zmiennych sesyjnych, bądź gdziekolwiek indziej.

Inna, dodatkową możliwości, nieco automatyzująca działanie i minimalizującą interakcje i wysiłek po stronie użytkownika jest skorzystanie z JavaScriptu. Prosta funkcja, ukrywająca pole do wpisywania math captcha wraz z ustawieniem wyliczonej wartości, po załadowaniu się strony. Użytkownicy z włączonym JS-em (czyli 99%) nie musieliby nic robić, jedynie pozostali musieliby wykonać te proste działanie. 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ła inną aktywność dyskusyjną – ping- i 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 przemyśleń nt. „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 *