Lepsza captcha
Spamerzy są wszędzie, boję się wręcz otworzyć lodówkę. Używanie obrazków potwierdzających ("captcha", "test turinga") staje się wręcz koniecznością. Ostatnio jednak trafiłem na problem - na pewnym forum phpBB2 spamerzy "przechodzili" rejestrację pomimo użycia tego zabezpieczenia. Najpierw myślałem, że po prostu siedzi tysiąc Chińczyków i przepisują kod. Ale spojrzenie w logi rozwiało wątpliwiości - nikt nie jest w stanie wypełnic formularza rejestracji w cztery sekundy.
Wniosek jest jeden - używają oprogramowania do odczytywania tekstu z grafiki - OCRa.
Dotychczasowe zebezpieczenie wyglądało tak:
Zrobiłem wiec trochę lepszą wersję, która wygląda tak:
Jaka jest różnica:
- Jest to kolorowe
- Tło jest obrazkiem
- Jest użyty font typu TTF (kształt literek jest inny i można go dowolnie zmieniać ściągając inny font)
- Kolor, pochylenie i rozmiar fontu
- Tekst jest przezroczysty
- Zawiera wyraźny tekst małą czcionką (zmyłka)
Minusy: trzeba dobrze dobrać obrazek oraz trzy parametry: "jasność", "nasycenie" i "alpha" aby napis był czytelny dla ludzi.
To wszystko powinno pomóc w oszukiwaniu OCRa.
Kod można pobrać stąd: captcha.phps
Kod w miarę możliwości usiłuje dostosować wielkość napisu do wielkości obrazka, jednak zgłupieje jak da mu się zbyt długi napis i zbyt wąski obrazek. Jeżeli nie będzie pliku z tłem to oczywiście będzie błąd. Jeżeli nie będzie pliku z fontem, to nie będzie napisu na obrazku. Wymagany jest moduł GD2 i Truetype (powinno być na większości hostingów).
Wszelkie uwagi mile widzane. Łącznie ze statystykami skuteczności.
Na stronie http://pornel.net/captcha jest opisane jak wygląda zła captcha. Pozwolę sobie nie zgodzić się z jednym argumentem - kolor. Kolor ma znaczenie. Obecne spamerskie OCRY nie potrafią w ogóle radzic sobie z kolorowymi obrazkami. Ponadto etap OCRowania który najpierw sprowadza obrazek do odcieni szarości pozwolę sobie przedstawić na podstawie 2 poniższych obrazków:
Drugi obrazek powstał po przekształceniu do odcieni szarości i wyostrzeniu krawędzi - brakuje litery H - mój program nie znalazł tam krawędzi. Trzeci, czwarty i piąty obrazek to efekt nałożenia filtrów wyostrzających krawędzie bez etapu sprowadzania do szarości.
Czego to dowodzi? - Każdą captchę da się złamać. Jest to tylko problem opłacalności. A jaki z tego wniosek? Unikajmy takich rozwiązań, które już ktoś zastosował w tysiącach egzemplarzy.
Zrobiłem jeszcze jedną captchę:
Niestety po przefiltrowaniu w programie graficznym na obecność krawędzi wyszło takie coś:
Kod jest do pobrania stąd: captcha2.phps
Pozmieniałem trochę:
I już filtr krawędzi daje zupełnie inny obraz:
Niestety captcha jest słabo czytelna :(
Kod jest do pobrania stąd: captcha3.phps
Chciałbym wyraźnie zaznaczyć, że cały ten kod w plikach *.phps pokazuję wam po to, abyście mogli sobie samemu zrobić generowanie obrazka. Trzeba ściągnąć samemu font *.ttf, podłożyć własny background, dobrać odpowiednio parametry etc...
No i trzeba wyważyć pomiędzy czytelnością obrazka a jego podatnością na OCR. Forum phpBB przy obrazku daje taki text: Jeżeli nie możesz odczytać kodu skotaktuj się z administratorem - to powinno rozwiązać problemy ludzi słabowidzących.
Acha, oczywiście zamiast $_GET['txt'] trzeba użyć $_SESSION['txt'] albo czegoś podobnego, bo podanie spamerom na tacy <img src="captcha.php?txt=alamakota"> jest trochę niepoważne...
captcha po lewej (4DVMB) jest łamana jako 4OYMB
Komentarze:
Nie po to, żeby utrudnić życie użytkownikowi, ale po to, żeby skrypty, które dodają komentarze automatycznie miały problem z przepisaniem captcha. W Twoim przykładzie wystarczy pobrać treść strony (jedna linia kodu) i wyodrębnić tekst, a następnie go przekleić...
jestem daltonistą, twoje rozwiązanie oznacza dla mnie kłopot.