CAPTCHA - jak odróżnić złe od gorszych

CAPTCHA to skrót określający zautomatyzowany test turinga, który można by przeprowadzić na różne sposoby, ale w tym artykule będę udawał, że chodzi jedynie o obrazki z literami do przepisania.

 

Nie ma czegoś takiego jak dobra CAPTCHA, bo wszystkie wymagają od użytkownika fatygi. Można jedynie zrobić złe, bardzo złe albo bardzo złe i na dodatek nieskutecznie.

Wiele CAPTCHA w Sieci jest kiepsko wykonanych i działa wyłącznie dlatego, że nikomu nie chciało się ich łamać.

Jeśli nie jesteś webmasterem na prawdę wielkiego serwisu, to zamiast CAPTCHA zrób mniej inwazyjne zabezpieczenie, którego też nikomu nie będzie chciało się łamać.

Nieczytelne dla ludzi

Test ma być jak najłatwiejszy dla człowieka i jak najtrudniejszy dla maszyny. Niestety, wielu autorów daje się zmylić, że jeśli dla nich obrazek jest nieczytelny, to też będzie dla maszyny. Przeciwnikiem CAPTCHA jest program(ista) OCR, który ma do dyspozycji szeroką gamę narzędzi podobnych do filtrów programów graficznych.

W szczególności złymi pomysłami są:

  • captchowe zachmurzenie Niski kontrast. Poprawianie kontrastu i znajdywanie krawędzi to są prościutkie algorytmy.
  • Duże odstępy między literami (czasem dla utrudnienia w nieregularnym położeniu). Jeżeli są odstępy między literami, to łatwo wyizolować pojedyncze znaki — wtedy nieregularność położenia liter myli tylko ludzi, a zrobione przez autora odstępy odwalają już połowę roboty za OCR-a.
  • który kanał wyraźniejszy? Kolor. W ogóle nie fatyguj się. Kolor pomaga złamać CAPTCHA, bo zamiast jednego, daje trzy rozseparowane kanały do analizy. Gdyby to przeszkadzało, to przecież zawsze da się poszarzyć obrazek.
  • zblurowane A przypomina zblurowane A bardziej niż zblurowane B Rozmycie liter. Są algorytmy wyostrzające, można zwiększyć kontrast, ale często nawet nie trzeba. Przy porównywaniu liter blur nie przeszkadza — wewnętrznie wiele OCR-ów nawet umyślnie bluruje, bo to pomaga dopasować wzorcowe litery do analizowanych, nawet jak różnią się kilkoma pixelami (fuzzy logic).
  • Drobny maczek. Mniej pixeli, mniej możliwych kombinacji, szybsze działanie OCR. W razie potrzeby komputer zawsze może sobie powiększyć.
  • Stałe lub charakterystyczne tło. Jeżeli atakujący może odtworzyć tło lub wygenerować coś zbliżonego, to może usunąć tło z CAPTCHA (wybitnie bezsensowne jest tło w kratkę). Jeśli tło ma wszędzie inny kolor lub inną jasność niż litery, to można je wyizolować.
  • Liczy się tylko czarny Małe przeszkadzajki. Kropki, kreski i inne duperelki o grubości innej, niż litery da się całkowicie usunąć algorytmami usuwania szumu (natomiast krzywe o grubości liter, blisko nich, są dobrą zmyłą… tak dobrą, że przeszkadzają nawet ludziom).

Użycie wymyślnych krojów pisma tylko trochę wzmacnia zabezpieczenie — OCR może spróbować łamać obrazek za pomocą różnych krojów i wybrać najpewniejszy wynik. Podobnie z obracaniem liter — dodaje etap przy łamaniu i zwiększa szansę pomyłki, ale zaaplikowane w granicach czytelności dla ludzi jest niewielką barierą.

Kompletne wpadki

Najzabawniejsze są CAPTCHA, które da się złamać bez analizy obrazka. Niektórzy autorzy, którzy koniecznie chcą obrazek, a nie rozumieją dlaczego, potrafią zmontować CAPTCHA z kilku osobnych obrazków przedstawiających pojedyncze litery lub generować CAPTCHA skryptem, który dostaje tekst jako parametr.

Proste do łamania są też CAPCHA mające stałe rozmieszczenie liter pisanych tą samą czcionką — wtedy wystarczy sprawdzić kilka strategicznych pikseli, by rozróżnić litery.

Widziałem też kilka razy rozwiązanie, gdzie autor sam przygotował parenaście obrazków. Jeżeli jest niewielka liczba możliwości, to człowiek może opisać botowi, który obrazek, jaki ma tekst, a nauczony bot sam już wyśle tysiące spamów.

Słabiusieńkie są też bezobrazkowe alternatywy. Można w pare minut napisać bota rozwiązującego proste działanie matematyczne albo klikającego n-ty guzik formularza. Szkoda fatygi, w takich przypadkach lepiej robić zwykłe filtrowanie.

BTW: Jeśli już implementujesz CAPTCHA, to upewnij się, że użytkownik musi je wpisać raz i tylko raz. Zapamiętaj sobie rozwiązane CAPTCHA w sesji i nie każ go ponownie wypełniać przy podglądzie albo jeśli każesz poprawić błędne/brakujące pola formularza.

To co jest trudne?

Litery blisko siebie. Nie można wtedy analizować każdej z osobna i jest szansa, że dwie litery zostaną zinterpretowane jako jedna.

Nielinearne transformacje, których nie da się rozpoznać na podstawie konturu tekstu. Obrócony albo falujący napis nie tak trudno automatycznie wyprostować. Bardziej kłopotliwe jest żabie oko nałożone w paru losowych miejscach.

Niesłownikowe wyrazy. Często OCR-y dają kilka możliwych odpowiedzi i sprawdzenie w słowniku ułatwia wybrać ostateczną. Nie trzeba od razu dawać całkowicie losowego zestawu, który jest trudny też dla człowieka — jako kompromis można generować słowopodobne ciągi ze zlepianych sylab.

Google kuma o co chodzi.

Przykłady złamanych KAPTCZ ;)

Ta w phpBB jest śmiechu warta. Mogli by od razu wypełniać pole tekstem do przepisania ;)

Słynna PWNtcha. Uwaga: ten skrypt nie jest łamaczem ogólnego przeznaczenia. To, że nie złamie obrazka, który mu podeślesz wcale nie oznacza, że twoja CAPTCHA jest mocna, bo:

  • Program ma łamać tylko te, pod które został zaprojektowany. Dostosowanie parametrów do stylu twojego obrazka może zająć parę minut, ale musi to zrobić człowiek.
  • Do atakowania nie jest potrzebna 100% skuteczność. Wystarczy zaledwie kilkuprocentowa skuteczność do zalania spamem — bot ma dzień i noc na próbowanie.

EZ Gimpy i nawet bardzo trudny Gimpy zostały złamane (nie całkiem, ale wystarczająco do spamowania).

Badania dotyczące trudności przeszkód w CAPTCHA z przykładami.

Na deser o tym, jak CAPTCHA wkurza użytkowników.

 

Licencja: copyleft 

 

Źródło: porneL