Spam na Blox, czyli jak nie implementować CAPTCHA.

Od dłuższego czasu serwis blogowy Blox boryka się z plagą spamu. Słyszałem zapewnienia, że moderatorzy/admini walczą z tym zjawiskiem, ale wydaje mi się, że bez większych sukcesów, a nawet, że problem spamu się nasila. Jest to zjawisko dla wszystkich (poza spamerami) niekorzystne, a nierzadko na stronie głównej o pewnych porach spamy stanowią 30 i więcej procent wpisów.

Postanowiłem zerknąć na proces zakładania konta od początku. Pierwsze co rzuciło mi się w oczy, to prostota CAPTCHA. Być może parę lat temu wystarczało coś takiego, by odstraszyć spamerów, ale wojna trwa – istnieją narzędzia do automatycznego rozpoznawania nawet dość skomplikowanych CAPTCHA ze stosunkowo dużą pewnością (grubo ponad 50%). Niedawno nawet Jogger, który pozwalał właścicielowi bloga na mocne zmiany wyglądu CAPTCHA (kształt, wielkość, kolor), przy komentarzach dorzucił do niej litery obok cyfr, bo spamerzy się przebijali…

Żeby sprawdzić, czy nie przypadek, że CAPTCHA jest taka słaba, wcisnąłem F5, raz, drugi, trzeci… I okazało się, że trafiłem na powtarzające się słowa. Chwilę się pobawiłem i faktycznie, nie da się ukryć, CAPTCHA powtarza się i to – na oko – często. Postanowiłem sprawę zbadać dokładniej.

Sposób badania: uruchomienie przeglądarki, wyczyszczenie historii, w każdej serii 50 przeładowań strony (F5 lub ctrl-r), zapisanie wyników do pliku (każdy wynik w pojedynczej linii) w takiej kolejności, w jakiej się pojawiały. Żeby wykluczyć wpływ User Agent i czasu, każda seria wykonywana na różnej przeglądarce i w odstępie minimum kilkudziesięciu minut.

W pierwszej serii (przeglądarka chromium) 50 ciągów wyrazów wystąpiły 32 unikatowe ciągi, przy czym 4 wystąpiły trzykrotnie, 10 dwukrotnie, a 18 tylko raz. Dodatkowo rzuciła mi się w oczy prawdopodobna metoda powstawania wielu CAPTCHA – podział słowa na sylaby, połączone z ew. wyrzuceniem niektórych liter, a następnie wymieszanie tych slab. Przykładowo zykamu i kazymu (czyli muzyka), letefon, fontele i fonlete (czyli telefon), zetagagataze (czyli gazeta), lafiorka, fiorkala, fiorlaka (czyli kalafior).

Druga seria, kilkadziesiąt minut później na midori – 34 unikatowe ciągi, jeden wystąpił czterokrotnie, 13 dwukrotnie, 20 jednokrotnie. Wyrazy zdecydowanie powtarzają się między seriami – dla obu serii łącznie wystąpiło 46 unikatowych ciągów, 2 wystąpiły pięciokrotnie, 6 – czterokrotnie, 8 – trzykrotnie, 12 -dwukrotnie, 18 – jednokrotnie.

Ponieważ ciąg znaków pod którym można poprać losowany obrazek może być stały (z danego można korzystać wiele razy), postanowiłem uprościć sobie pobieranie i przeliczanie. Szybki skrypt, który przy pomocy wget pobiera zadaną ilość obrazków i zapisuje do kolejnych plików, a następnie sprawdzenie sum kontrolnych (md5) tychże plików. I tu ciekawostka – sumy kontrolne praktycznie się nie powtarzają. Sprawdziłem organoleptycznie i faktycznie – o ile wyrazy powtarzają się często, to praktycznie każdy plik jest binarnie inny. Czyli raczej mała ilość wyrazów raczej nie wynika z chęci cache’owania.

Dla porządku: dla 100 plików 3 miały takie same sumy kontrolne, a kolejne 5 sum występowało dwa razy. Powtórzyłem eksperyment dla 1000 plików. Pojawiło się 611 unikatowych sum kontrolnych, jedna z sum występowała 7 razy, jedna 6, sześć wystąpiło 5 razy, cztery – 20 razy, trzy – 53 razy, dwie – 188 razy i jedna – 342 razy.

Nie sprawdzałem dokładnie, czy dany wyraz w CAPTCHA koreluje z ciągiem w treści (na oko nie), ani z jaką skutecznością zadziała automatyczne rozpoznawanie, ale przy tak częstym powtarzaniu się ciągów znaków i plików nie ma to znaczenia – wygląda, że baza jest za mała, a przekształcenie zbyt proste i można spokojnie stworzyć skrypt, który porówna sumę md5 wygenerowanego pliku z arbitralną bazą.

O problemie pisałem wstępnie na forum, póki co bez odzewu. W każdym razie liczę na to, że wpis zmotywuje administratorów blox do załatania ewidentnej dziury w zakładaniu nowych kont. Obecne likwidowanie spamerskich blogów przypomina wylewanie wody z łódki, zamiast załatania w niej dziury, przez którą wody nabiera.

Oczywiście najlepsze byłoby podpięcie jakiegoś znanej, sprawdzonej implementacji CAPTCHA, zamiast wymyślania koła od nowa (i to sugestia dla tych, którzy chcą stosować tego typu rozwiązanie) ale wydaje się, że nawet z istniejącą implementacją można prosto zadziałać w taki sposób, że stanie się ona choć w części efektywna. Przede wszystkim mam na myśli zwiększenie bazy słów i ilości przekształceń.

Obok złych wiadomości są też i dobre – co prawda problem nie jest to Blox, tylko ogólnie dotyczy konto.gazeta.pl, ale – jak wynika z korespondencji z administratorami Blox – jest znany i ma być najdalej w kwietniu poprawiony. Pozostaje uzbroić się w odrobinę cierpliwości i liczyć na to, że po załataniu dziury uda się skutecznie pozbyć spamerów. W tej chwili bywa tak, że 100% wpisów na głównej stanowią spamy…

Pagerank, statystyki, reklamy, czyli cykliczne podsumowanie bloga.

Dawno nie było nic o statystykach na blogu – ostatni wpis w tym temacie prawie półtora roku temu. No to tak dla pamięci – systemy operacyjne. Windows XP – 36,5%, Windows 7 – 22,3%, Vista – 9,2%, czyli łącznie Windows łącznie 68%. Skutek większej ilości wejść z wyszukiwarki na niezwiązane z Linuksem frazy, zapewne. Linux prawie 26%, Mac OS X – spadek do 2,2%.

Jeśli chodzi o przeglądarki to Firefox nadal trzyma się mocno – 51%. Nie jest niespodzianką przyrost użytkowników Chrome – 19%, lekki spadek Opery – 11,5%. Różne wersje IE – minimalne umocnieni, do 10,5%. Safari 2,5%, Mozilla/5.0 (Netscape) – drastyczny spadek do 4%.

Rozdzielczość ekranu bez większych zmian – liderem pozostaje kategoria 1280×800 lub 1280×1024 z 32,5% (nadal spadek).

Tradycyjnie Google zamieszało z pagerankiem. Tym razem pozytywnie, bo jest 5 dla tego bloga, natomiast zdziwił mnie wysoki pagerank moich pozostałych nowych tworów – zarówno mój blog muzyczny jak i blog będący fanpage Bez Krótkich Spodni mają aż 4. Czyli więcej od mojego starego bloga. Chyba aberracja.

Zmieniło się trochę, jeśli chodzi o zabawę z reklamami. Pożegnałem AdTaily, próbowałem znaleźć polską alternatywę. Bez efektów. Koniec końców postanowiłem wrócić do ogólnoświatowego monopolisty w tym względzie, czyli Google. W sumie za wcześnie mówić o efektach, jedno co warto powiedzieć to fakt, że Google, mimo kreowania się na proste, wcale proste nie jest. Za dużo opcji, za dużo terminów. Cóż, taki standard, ale przydałby się widok uproszczony, przynajmniej na początku. 😉

Goodbye AdTaily.

Kończę zabawę z AdTaily. Wcześniej bywało lepiej lub gorzej, ale jak przeglądam stare wpisy na blogu, to były i problemy z widgetem, i z podejściem do klientów (wpadka z logowaniem), ale jakoś to funkcjonowało. Niemniej, z perspektywy patrząc, widać było pewien trend.

W międzyczasie pojawiło się trochę zmian. Pierwsza, to oczojebne irytujące animowane reklamy. Zniosłem. No dobrze, nie tyle zniosłem, co w pierwszej chwili nie zauważyłem, że takie paskudztwo się pojawiło. I raczej nie trafiały do mnie na blogi. Oczywiście system nie wspiera rozróżnienia animowane/statyczne od strony użytkownika – można albo włączyć moderację na wszystkie, albo na żadne. Czyli albo moderujesz ręcznie wszystkie reklamy, albo możesz któregoś dnia obudzić się z dyskoteką na blogu.

Do tego AdTaily przerzuciło obowiązek generowania danych do US na użytkownika (wcześniej wysyłali PIT, teraz tego nie robią). Czyli w żaden sposób nie pomaga w rozliczaniu podatku, choć robili to wcześniej na początku.

Kolejny przykład nie liczenia się ze zdaniem użytkownika, to włączenie wszystkim, na siłę, reklam CPC po ich wprowadzeniu. Często wspomnianych wcześniej animowanych. Znamienne wiemy lepiej, niż klient. Dodatkowo, nie ma nawet opcji moderacji po włączeniu CPC – albo wyświetlają się wszystkie, albo żadne. Czy CPC bywają animowane? Oczywiście, że tak. Czyli CPC też odpada, jeśli ktoś chce mieć minimum estetyki na stronie, a nie dyskotekę.

Gwoździem do trumny jest ostatnia decyzja, czyli kolejne wiemy lepiej, tym razem i w stosunku do wydawców, i reklamodawców. Chodzi oczywiście o arbitralnie ustalane czasy wyświetlania reklam, ironicznie nazwane lepszymi rezultatami kampanii reklamowych. AdTaily nie jest już elastyczne i dla małych. Teraz mniejsi obrywają terminami wyświetlania typu 90 dni. Kto tu kupi reklamę na 90 dni?! Raczej nikt. Ale tłumaczą, że klienci, którzy kupowali na krótki termin, nie wracali. Więc, jak prosili, zaufałem i zrobiłem test.

Zgodnie z przewidywaniami, w ciągu ponad miesięcznego testu od czasu wprowadzenia tej zmiany, nie została sprzedana ani jedna reklama, czyli przychód z reklam wykupionych w tym okresie wyniósł okrągłe zero. Nie wykupiono reklamy ani przez widget, ani przez sklep AdTaily (CPC wyłączyłem z uwagi na reklamy animowane). Ergo, AdTaily przestało dla mnie, jako wydawcy istnieć istnieć, a banner na stronie reklamował w tym czasie głównie AdTaily. Więc pora zakończyć współpracę i wypłacić pieniądze (szczęśliwie mam więcej, niż wynosi minimalna kwota wypłaty).

Nie jestem zdziwiony takim wynikiem ani obrotem sprawy. Ba, ten wpis napisałem w znacznej części blisko miesiąc temu i tylko dla formalności czekał na publikację. Bo nie trzeba być Sherlockiem, by przewidzieć wpływ tej decyzji. Sporo argumentów przeciw takiemu rozwiązaniu pojawiło się także w komentarzach do wpisu na Antyweb.

Na koniec mała statystyka. Pierwsze reklamy sprzedałem w maju 2009. Mamy październik 2011, więc 30 miesięcy. W ciągu tego czasu zebrało się, na obu blogach, wliczając w to CPC, niecałe 120 zł. Przeciętnie zawrotne niecałe 4 zł/m-c. Przed podatkiem. Litościwie pominę szczegółowe porównanie z LinkLift, którego reklamy nie są już niestety sprzedawane na Polskę (ale wykupione wcześniej nadal przynoszą dochód), dość powiedzieć, że za jednego tylko linka tekstowego na starym, nieutrzymywanym blogu otrzymałem od LinkLift znacznie więcej w tym czasie. Szkoda też, że ProLink wymaga kodu PHP i że nie ma on integracji z Blox.

No i właśnie ostatnia cecha, plus domyślne nie liczenie się ze zdaniem klienta, przekładające się na przymusowe bycie królikiem doświadczalnym skłaniają mnie do podjęcia takiej decyzji. Być może kiedyś wrócę do AdTaily, na razie jednak wolę pobawić się rozwiązaniami oferowanymi przez konkurencję.

Ostatecznie wczoraj, po miesiącu, AdTaily wycofało się ze sztywnej ilości dni, a dokładniej użytkownicy mogą wyłączyć sztywną ilość dni wyświetlania reklamy. Lepiej późno, niż wcale.

UPDATE: Jakby ktoś miał złudzenia, że AdTaily się przejmuje użytkownikiem i jego zdaniem, albo, że włączenie moderacji uchroni go przed pojawieniem się animacji to polecam ten tekst o tym, jak AdTaily moderuje reklamy za użytkownika. Cieszę się, że nie doczekałem tego.