9.07.2006
Prostsze CAPTCHA
CAPTCHA to obrazek z powyginanym, niełatwym do odczytania tekstem, który jest używany jako zabezpieczenie przed automatami w formularzach zakładania kont czy dodawania komentarzy w różnych serwisach. Robert Drózd przygotował pół roku temu fajny opis tego mechanizmu. Uzasadnia między innymi jego wady.
Jeśli jednak konieczne jest zastosowanie CAPTCHA, można spróbować zwiększyć jego wygodę. Zazwyczaj mechanizm polega na pokazaniu kilku liter lub liter i cyfr na obrazku. Użytkownik musi jest wpisać w pole tekstowe. Jeśli jest to to samo, co na obrazku - świetnie. Jeśli nie - powtórka.
Główny zarzut od większości ludzi to niska czytelność tekstów. Najczęściej jednak tylko niektóre znaki są mało czytelne. Mechanizm weryfikacji może zatem zrelaksować wymagania: wpisane przez użytkownika słowo jest akceptowane, jeśli znajdzie się w nim np. co najmniej 5 z 7 znaków takich, jak w oryginale, w odpowiedniej kolejności. Dokładniej: jeśli po wyjęciu 2 znaków z 7 wpisanych przez użytkownika otrzymujemy dobry podciąg oczekiwanego hasła, to akceptujemy wpis.
Dlaczego to może zadziałać lepiej?
- człowiekowi powinno być znacznie łatwiej trafić 5 z 7 niż maszynie. Maszyna przy rozpoznawaniu obrazu ma obok problemów z rozpoznaniem, jakie są to konkretne litery, jeszcze problem z rozpoznaniem, gdzie litery właściwie w ogóle są (gdzie się zaczynają, gdzie kończą) — choć to już zależy od postaci obrazka
- jeśli człowiek się pomyli, to najprawdopodobniej nie w kolejności, a w odczytywaniu poszczególnych liter. Innymi słowy, jeśli np. hasłem jest abcdefg, użytkownik może wpisać abodetg, natomiast kolejności jako takiej raczej nie zamieni.
- można manewrować wymaganą precyzją (np. 3 z 6 — bardzo łagodny wymóg), wciąż zachowując dużą liczbę kombinacji. Może można nawet wprost napisać: “podaj co najmniej 3 litery z tego słowa, nie zmieniając ich kolejności”…
Jedynym ryzykiem jest to, że i maszynom odczytującym taki tekst z obrazka jakimiś sprytnymi algorytmami będzie trochę łatwiej. Jednym ze skutecznych mechanizmów dekodowania takich zabezpieczeń jest PWNtcha.
Ach, i jeszcze jedno — moim zdaniem należy ignorować wielkość liter w CAPTCHA. Podwojenie liczby znaków nie wpływa znacząco na skuteczność zabezpieczenia, a czasami zwiększa ryzyko pomylenia liter przez człowieka (np. D i O łatwiej pomylić niż d i o).
Czy ktoś z Was zna mechanizm analogiczny do CAPTCHA, który można by podsunąć w formularzu, aby zweryfikować, czy to człowiek, czy maszyna go wypełnia?

ja się spotkałem z checkboxem, który trzeba było zaznaczyć i tyle ;]
Pomysł dobry, choć pewnie maszyny też będą z czasem 5 z 7 trafiały. :)
Natomiast wielkość liter - pełna zgoda, zresztą chyba wiele CAPTCHA na które trafiałem nie rozróżniała wielkości liter.
Zastanawiam się, czy w tych obrazkach nie dałoby się stosować pełnych słów, jak to się dzieje np. na bramce Orange. Wtedy jeśli jednej litery nie poznajemy, resztę rozumiemy z kontekstu. Atak słownikowy na takie zabezpieczenia byłby utrudniony, bo przecież spambot miałby tylko jedną próbę…
Pomysły analogiczne to choćby testy inteligencji, o których też wspominałem w swoim artykule. Eric Meyer, ten od CSS wymyślił WP GateKeeper. Jak to działa, można zobaczyć u Mikołaja: proste, ale skuteczne.
Google ma świetny Captcha - chociaż nigdy nie odczytuję ich glifów, tylko klikam na ikonkę wózka inwalidy i puszczają mi z taśmy cyferki. :]
Całkiem nieźle mogłoby się sprawdzić captcha polegające na wypełnieniu blanka w zdaniu (znane powiedzenie albo odpowiednia deklinacja/utworzenie wyrazu pochodnego od wyrazu podanego w nawiasie).
Tak przy okazji: ułomność captcha wynika z bardzo niskiej dywersyfikacji używanych metod.
Obrona captcha to nic innego, jak próba zweryfikowania jednego komputera przez drugi komputer. Ponieważ mają teoretycznie identyczne możliwości, to pozwolę sobie przytoczyć tu swoją zasadę związaną z rekrutacją pracowników:
Ocena kompetencji wymaga dokładnie tej samej wiedzy, co wykonywanie ocenianych czynności. W związku z tym, jeśli ktoś nie posiada dostatecznej wiedzy, aby stać się kompetentnym pracownikiem, to jednocześnie nie posiada dostatecznej wiedzy, aby określić swoją niekompetencję. Dlatego zadawanie pytania “czy nadaje się pan do tej pracy?” jest zupełnie pozbawione sensu w kontekście oceny faktycznej przydatności pracownika.
Ja używam “Did you pass math?”
http://www.herod.net/dypm/
IMHO lepsze niż Captcha i nie wymaga obrazków.
Kiedyś widziałem rozwiązanie podobne do DYPM? Które nie polegało na matematyce tylko np. zwykłym podawaniu 6 litery 3 słowa w przykładowym zdaniu.
Można też zrobić formularz z kilkoma submitami i losować, który musi zostać kliknięty, by komentarz został dodany - zupełnie jak w Total Commanderze ;)
nbw, ale gdzies bedziesz musial dac informacje, ktory przycisk ma byc wcisniety ;-) takze to chbya nie jest dobre zabezpieczenie.. :P
suli:
Jak pisałem wyżej: żadne nie jest dobre. Jeśli jeden komputer potrafi coś sprawdzić, to potrafi to tak samo dobrze zrobić drugi.
Problem w tym, czy komuś się chce pisać łamacz captcha pod twój serwis. Jeśli mu się chce, to nic ci nie pomoże.
Nie wiem czy takie kombinowanie jest potrzebne. Raczej proponowałbym nieużywanie liter, które człowiek może łatwo pomylić, a utrudnianie odczytania skryptom może polegać na losowaniu z dużej próby czcionek. Trzeba wybrać czytelne, ale jak najbardziej różne od siebie. Wtedy automatów OCR nie będzie można dobrze wyuczyć, bo próba będzie bardzo różnorodna.
A dla człowieka to niewielka różnica, czy czcionka ma szeryfy czy nie.
Riddle: przy jakich usługach jest CAPTCHA Google’a — przy rejestracji nowego konta gdziekolwiek, np. Gmail?
Patrys: nie masz racji. Piszesz: “Jeśli jeden komputer potrafi coś sprawdzić, to potrafi to tak samo dobrze zrobić drugi.” Na tej zasadzie, jeśli ja mogę coś sprawdzić, to możesz i Ty? Nie. Dowód: jaki jest kolor pierwszego przedmiotu na moim biurku od prawej?
Nie wiesz, a ja wiem. ;)
Idąc dalej: pierwszy komputer dostaje prawidłową informację za friko, drugi jej nie zna, musi ją sam wydedukować, i to w najlepszym razie półautomatycznie w przypadku zabezpieczeń takich, jak CAPTCHA. Nie wiem, skąd pomysł, że dla dowolnego zabezpieczenia znajdziesz taką metodę!!
Elsindel:
Dla dowolnego, które nie jest podparte funkcją stochastyczną. Choć i na to działa metoda bruteforce, a jego przydatność dla ludzi byłaby znikoma.
Jeśli captcha opiera się na modyfikacji obrazka z tekstem, to w najgorszym wypadku rozwiązaniem będzie sieć neuronowa i proces treningu.
Z tym, że w pewnym momencie (a komputery są coraz szybsze), okaże się, że zadanie to jest prostsze dla maszyny niż dla człowieka.
Pamiętaj, że mówię tutaj o ataku na captcha konkretnego serwisu, a nie o uniwersalnym solverze do wszystkich możliwych zadań. Stąd uwaga o przedmiocie na biurku jest nieadekwatna, bo komputer atakujący wie o serwisie co najmniej tyle, co statystyczny rejestrujący się użytkownik.
Z captcha jest jak z mechanizmami weryfikacji numerów seryjnych. Jedyne rozwiązanie, które mogłoby zadziałać, to zewnętrzny serwis paszportowy, który fizycznie sprawdzałby autentyczność zarejestrowanych ludzi (choćby przez wysłanie im listu z kodem aktywacyjnym snailmailem) i udostępniał możliwość zdalnej autentykacji za pomocą serwisów korzystających z jego usług.
W takim układzie użytkownik rejestrowałby się najpierw w jednym z serwisów obsługujących to API, następnie potwierdzał swoją tożsamość i aktywował konto, a dopiero potem mógł użyć swojego profilu (wybierając serwer autentykacji, podając login itp.) do rejestracji w serwisach trzecich, bez potrzeby rozwiązywania rebusów.
Podobną usługą jest MS Passport, ale jego ułomność polega na centralizacji, więc twoje dane są w całości zależne od jednej firmy.
Zaleta sieci rozproszonej byłaby taka, że autor serwisu mógłby wybrać sobie, którym serwisom ufa.
Mogę pisać całkiem od rzeczy, bo jest gorąco, kręci mi się w głowie i co godzinę urywa mi się film na parę minut.
Elsindel, właśnie tam. Też przy komentowaniu na bloggerze i paru nieudanych logowaniach do konta Google?
ja korzystam z bardzo naiwnej i prostej metody, ale przecież (jak rozumiem) chodzi nam o powstrzymanie automatów spamujących, a nie test turinga.
javascript liczy ile razy powtarza się jakaś litera w tekście komentarza. wysyła tą informację z formularzem. serwer liczy to samo i porównuje. jest to bardziej test na występowanie javascriptu po drugiej stronie. ale działa.
wady są mi doskonale znane.
zaleta jest taka, że działa. od wprowadzenia: zero spamu.
no i jeszcze jedna zaleta: transparentne dla usera. o ile ma javascript.
Nie ma chyba prostrzego mechanizmu CAPTCHA niż w komentarzach do notek na blog.pl ;)
Marcin: a podasz linka, gdzie można obejrzeć opisany przez Ciebie sposób?
blog.art.pl (dowolny blog, który ma komentarze… no, poza kilkoma na starym engine).
Tak btw: http://hotcaptcha.com/