WP Math Captcha

tech • 567 słów • 3 minuty czytania

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 tym celu 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 zaznajomieniu się z kilkunastoma odechciało mi się kontynuacji tego procesu. Nie znalazłem nic co by mi się spodobało i mnie zadowalało. Zmuszony zostałem do wymyślenia i stworzenia czegoś samodzielnie, czegoś 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 szukam 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 zadowalają. 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 Gynvaela.

Wiedząc już czego dokładnie chcę wystarczyło zabrać się do pracy. Po kilku minutach powstała pierwsza wersja wtyczki WP Math Captcha i wylądowała 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. Ot, najprostszy możliwy sposób.

Oczywiście wynik nie jest jawny (w sensie liczbowy wynik) bo byłoby to zbyt proste i pewnie jakieś boty by sobie z tym poradziły lub z czasem dostosowały. Zatem do formularza dołączamy cokolwiek co tylko 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, bo można trzymać go w zmiennych sesyjnych, bądź gdziekolwiek indziej. Ważne, żeby był dostępny w momencie weryfikacji wyniku.

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-a chyba jeszcze nie uświadczymy ;)

[dodano 2009-09-18 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ę JS-em.

[dodano 2009-09-20 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 ;)

Komentarze (6)

GDR! avatar
GDR!
20090923-222736-gdr

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.

Malcom avatar
Malcom
20090923-225223-malcom

O wykorzystaniu kontrolki webowej nie pomyślałem, a daje to bardzo dużo możliwości i ułatwia twórcom pracę.

To już nikt nie pisze 5-linijkowych perlowych botów?

Trzeba “whardcodować” we wtyczce atrybut tabindex w polu input. W planach jest dodanie funkcji umożliwiającej zastosowanie własnego formatu/stylu, aczkolwiek funkcja zwracająca wygenerowane dane do “samodzielnego montażu” pól i etykiet będzie dużo lepszym rozwiązaniem, co znacznie ułatwi integrację z resztą szablonu.

GDR! avatar
GDR!
20090924-000442-gdr

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.

ktoś avatar
ktoś
20091231-124812-ktos

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.

ktoś avatar
ktoś
20091231-130020-ktos

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

Malcom avatar
Malcom
20091231-130259-malcom

Wystarczy odpowiednio zmodyfikować działanie (linie 69 i 70). Można dodać losowanie kolejnych cyfr i składać różne operacje matematyczne, od prostych po bardziej złożone.

W Twoim wypadku wystarczy usunąć $a * i zostanie samo dodawanie ;)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/