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ć (zobacz przykłady podlinkowane na końcu artykułu).
Jeśli nie jesteś webmasterem naprawdę 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ą:
- 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.
- 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 komputer zawsze może poszarzyć obrazek (ale daltoniści — niezbyt).
- 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ć.
- 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.
Month of Bugs in Captchas ma pełno przykładów stron (w tym Google!), które dają się wrobić w akceptowanie jednej i tej samej odpowiedzi do dowolnej ilości postów, itp.
Proste do łamania są też CAPCHA mające stałe rozmieszczenie liter pisanych tym samym krojem pisma — wtedy wystarczy sprawdzić kilka strategicznych pikseli, by rozróżnić litery.
Widziałem też kilka razy rozwiązanie, gdzie autor sam przygotował paręnaś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ą oczywiście bezobrazkowe alternatywy. Można w parę 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.
Od strony wizualnej Google kuma o co chodzi.
Przykłady pokonanych zabezpieczeń, czyli kapcza kaput
- Windows Live złamane (detale).
- GMail złamany.
- Yahoo pokonane. Nawet ich stary upierdliwy Gimpy (prekursor EZ Gimpy) został złamany (nie całkiem, ale wystarczająco do spamowania).
Powyższe zostały złamane przez algorytmy automatycznie “czytające” litery. Da się bez tego — CAPTCHA można złamać za pomocą pornografii albo taniej siły roboczej.
Ta w phpBB2 jest śmiechu warta, a phpBB3 super prosta. Mogliby od razu wypełniać pole tekstem do “przepisania” ;)
Ukrainiec, który łamie CAPTCHA i sprzedaje algorytmy spamerom. Większość super-kolorowych powyginanych zamotanych obrazków to dla niego łatwy zysk. Chiński hacker potwierdza, że kolorowe ciapki są dla amatorów.
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.
Badania dotyczące trudności przeszkód w CAPTCHA z przykładami.
Na deser o tym, jak CAPTCHA wkurza użytkowników, obrazkowo:)