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…

Globalne ocieplenie czyli public review.

W temacie globalnego ocieplenia znowu zrobiło się gorąco. Ostanie trzy dni przyniosły aż trzy newsy. Chronologicznie środkowy to głos sceptyków i tradycyjne obecne modele ocieplenia klimatu są złe, to nie jest takie straszne. Na co, jako ostatni news, oczywiście pojawiły się odpowiedzi typu modele są dobre, próba obalenia jest zła.

Pojawiać się może pytanie, skąd takie rozbieżności u naukowców, którzy operują na obiektywnych danych? Wiadomo, że klimat rozmów o klimacie nie jest najlepszy. Nie chodzi o przyczynę (jak nie wiadomo o co chodzi, to chodzi o…, chociaż zwykła niemożność przyznania się, że ileś tam lat pracy powinno trafić do kosza też wchodzi w grę), tylko o jak to jest, że biorą to samo i mają przeciwne wyniki? No właśnie… nie biorą tego samego.

Po pierwsze, nie wszyscy mają dostęp do tych samych danych. Publikacja przez Wikileaks danych, modeli i emaili dotyczących badań nad globalnym ociepleniem pokazała, jak naukowcy z grupy „proociepleniowej” opracowujący modele starają się utrudnić „reszcie świata” dostęp do danych i modeli (odmowa publikacji, obscufowanie).

Po drugie, dane „nie pasujące do modelu” są pomijane. Przez obie strony, gwoli ścisłości. Pozostaje pytanie o kryteria odrzucenia danych – statystyka i prognozowanie jak najbardziej dopuszcza coś takiego, ale przy odrobinie złej woli lub zwykłym błędzie w prosty sposób pozwala to też wypaczyć wyniki.

Po trzecie, są różne metody budowania modeli. Oczywiście każda daje trochę inne rezultaty. I zakłada pominięcie innych danych, więc jest naturalne, że wyniki będą się różnić, pozostaje pytanie jak bardzo.

O rozbieżności czy błędy w obliczeniach, nawet tych stosunkowo prostych, nie jest trudno. Nawet wtedy, gdy liczy się proste sprawy, takie jak np. ile tak naprawdę płacimy podatku od przychodu z wykonanej pracy (wpis na ten temat niebawem, sprawa ciekawa bo wahania były od 83%, przez 70% do ok. 50%). Dlatego jestem zwolennikiem publikowania pełnych danych, zarówno źródłowych, jak i dotyczących modelu obliczeń. Jest szansa, że ktoś przejrzy i znajdzie błędy, nieścisłości, nieuwzględnione dane i model będzie lepszy. Tworzenie sekretów i knucie prowadzi do podejrzliwości i teorii spiskowych, zaczyna się kombinowanie, FUD i propaganda zamiast nauki. Co nie dziwi, biorąc pod uwagę, że na wynikach tych badań opierają się decyzje w zakresie prawa i polityki. Ale IMHO nauka powinna być ponad tym.

I na koniec pierwszy chronologicznie news – po latach starań „sceptyków klimatycznych” zostały opublikowane dane z większości stacji na świecie. Polska jak zwykle się popisała i odmówiła zgody na publikację danych (ciekawe czemu, bo mam wrażenie, że zostały on uzyskane za pomocą środków publicznych). Czyli teraz każdy może spróbować zbudować swój model zmian klimatu, albo po prostu sprawdzić, czy naukowcy nie zrobili gdzieś błędu (o ile opublikują swój model, tj. algorytm/funkcję z której korzystają). Małe, a cieszy.

Częstość piątku trzynastego.

Czy naprawdę piątek przypada trzynastego dnia miesiąca częściej, niż inne dni tygodnia, jak wynika z tego wpisu? Postanowiłem to sprawdzić, metodą najdoskonalszą, czyli brute force. Co prawda tylko dla lat 1970-2037 czyli w Unix Epoch (pełne lata).

Kod był praktycznie gotowy z czasów obliczeń, czy pracownicy zyskają, czy stracą na wolnym 6. stycznia. Ostatecznie wygląda on tak:

a wynik działania wygląda tak:

DOW - ilosc
1 - 116
2 - 118
3 - 115
4 - 117
5 - 117
6 - 116
7 - 117
Suma: 816

1 - Monday, ... , 7 - Sunday

Piątek oznaczony jest cyfrą 5, jak widać występuje on jako trzynasty dzień miesiąca 117 razy, podobnie jak czwartek i niedziela , więcej w badanym okresie jest wtorków trzynastego (118), a najmniej śród (113).

Pozostaje pytanie, dla jakich dokładnie lat prowadzona była analiza w oryginalnym wpisie. Na oko wygląda na jakieś 335 lat, pytanie które dokładnie. W każdym razie w badanym okresie nic nie wskazuje na większą częstotliwość występowania piątku w trzynasty dzień miesiąca.