CAPTCHA sustav je danas gotovo ne moguće izbjeći. Vrlo je važno koristiti jedan takav sustav zbog sve većeg broja korištenja botova na Internetu.
Strojno učenje i njegove grane kao što su duboko učene danas se koriste sve više vi više. Ponajviše zbog toga što je računalna snaga dosegla nivo da bi se takvi algoritmi mogli izvršavati u razumnom vremenu.
TensorFlow i Keras danas su jedni od najpopularnijih biblioteka za korištenje algoritama strojnog i dubokog učenja.
Iako ideja CAPTCHA sustava da pokuša otkriti tko koristi web stranicu bot ili čovjek, ovdje „pomažemo“ botu da zavara jednostavan CAPTCHA sustav kako bi se predstavio kao čovjek.
Ključne riječi: CAPTCHA, strojno učenje, duboko učenje, robot, čovjek, Tensroflow, Keras
CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)[2] sustav koristi se kako bi se razlikovala računala od ljudi. To je zapravo računalni program koji štiti web stranicu protiv botova tako što generira i ocjenjuje testove koje će većina ljudi najvjerojatnije uspješno riješiti dok trenutni računalni programi ne mogu takve testove riješiti.
Malo jednostavnije CAPTCHA sustave moguće je riješiti pomoću strojnog učenja i biblioteka za računalni vid. Konkretno predefinirane CAPTCHA slike koje su označene treba izrezati u segmente, gdje je svaki segment jedno slovo ili broj. Tada treba naučiti model strojnog učenja da pokušava prepoznavati brojeve i slove na CAPTCHA slici.
CAPTCHA testovi od korisnika traže da unesu tekst ili kliknu na određenu sliku. Sam unos ovisi o upitu koje računalo postavi. Recimo računalo može tražiti da se tekst sa slike replicira, odgovori na pitanje, riješi jednostavan matematički zadatak ili unese tekst nakon glasovne poruke. Računala imaju problema sa takvim zadacima jer tekst može imati različite fontove, veličine slova, zarotirane elemente, dodan šum pa čak i mrlje po tekstu. Takvi zadaci ne bi trebali predstavljati problem prosječnoj osobi, ali većina od tih zadataka zadaje probleme računalu.
CAPTCHA pomaže u borbi protiv[3]:
Zaobilaženje CAPTCHA sustava[1]:
Moni Naor je prvi koji je teoretizirao o načinima provjere dolazi li zahtjev od osobe ili od bota. Primitivni CAPTCHA test su 1997. razvili Andrei Broder, Martin Abadi, Krishna Bharat i Mark Lillibridge, da bi spriječili internet botove da dodaju URL-ove od njihovih pretraživača.
Da bi slike učinili otpornijim na OCR (engl. Optical Character Recognition), tim je simulirao situacije, koristili su primjere iz priručnika za skener gdje su prikazani znakovi krivo očitani uz pomoć OCR-a. 2000. godine, Luis von Ahn i Manuel Blum smislili su izraz 'CAPTCHA', koji je podrazumijevao općeniti program za razlikovanje ljudi od računala. Osmislili su višestruke primjere CAPTCHA-e, uključujući prve naširoko korištene CAPTCHA-a, one koje je u početku koristio Yahoo!. [1]
Danas postoji razne vrste CAPTCHA testova, ali ovdje su izdvojeni oni najčešći. [9]
Ovo je najjednostavniji primjer CAPTCHA testa. Test se sastoji od 4 znaka broja ili slova. Slova i brojke mogu biti nakošeni, font im može biti različiti i razmak između znakova nije konstantan. Ovakav CAPTCHA test ovaj rad pokušava razbiti.
U ovome primjeru znakova su također neravni i zakrivljeni, ali ovoga puta se vide samo konture znakova, dok je unutrašnjost prazna. Takve znakove je malo teže segmentirati računalu, ali su jako dobro vidljivi i razumljivi ljudima.
Ovakav tip je i ljudima dosta kompliciran zbog toga što su znakovi spojeni i nerijetko se znaju preklapati. Zbog toga je računalima još teže napraviti segmentaciju znak po znak i tako prepoznati pojedine dijelove.
Ovakva vrsta CAPTCHA testa je u većini slučajeva teža za čovjeka nego za računalo. Računalo vrlo lako može zanemariti šum oko znakova, dok ljude to može jako zbuniti. Dosta slika sa šumom uzeto je sa Googleovog sustava Street View.
Koriste se dva redaka znakova, kako bi računalo pri probijanju trebalo segmentirati dva puta po horizontalnoj osi i potencijalno zbunilo računalo. Ljudima nije ništa teže nego običan CAPTCHA test sa šupljim znakovima.
Ako se koristi ovakav slučaj testa, tada se od korisnika zahtjeva da izabere određeni lik koji se nalazi na slici. Ako ima više slika koje su također točne onda se izaberu sve. Ovaj problem je malo teži računalu jer test može tražiti stvarno razne stvari koje se trebaju pronaći na slikama.
Ovdje korisnik treba povući klizač do određene pozicije. Analizira se trag pokreta miša, brzina pokazivača i brzina reakcije. Računala bi imala nadljudske brzine u ovome slučaju pa je lako otkriti da korisnik nije čovjek.
Korisnik bi trebao napisati ono što je čuo ili u ponuđenoj traci odabrati što misli da je čuo npr. zvuk životinje ili instrumenta.
Makar se čini kao jako jednostavan test i zapravo to i je, ali ideja testa nije da korisnik klikne do pozicije gdje treba kliknuti. Nego se ispituje pomak miša do te pozicije. Nešto slično kao što smo imali kod tipa „Povucite i ispustite“. Danas se dosta često koristi Googleova implementacija reCAPTCHA.[4]
Strojno učenje grana je umjetne inteligencije koja se bave oblikovanjem algoritama koji svoju učinkovitost poboljšavaju na temelju empirijskih podataka. Strojno učenje jedno je od danas najaktivnijih i najuzbudljivijih područja računarske znanosti, ponajviše zbog brojnih mogućnosti primjene koje se protežu od raspoznavanja uzoraka i dubinske analize podataka do robotike, računalnog vida, bioinformatike i računalne lingvistike.[10]
Napadi na CAPTCHA testove izvodili su se u prošlosti, ali ne sa tolikom točnošću i toliko brzinom kao kada se koriste algoritmi strojnog učenja. Među prvim pokušajima probijanja CAPTCHA testova strojnim učenjem pripada grupi znanstvenika Guixin Ye, Zhanyong Tang, Dingyi Fang, Zhanxing Zhu, Yansong Feng, Pengfei Xu, Xiaojiang Chen i Zheng Wang. Njihov pristup se temeljio na algoritmu generativnih suparničkih mreža (engl. Generative Adversarial Network).[5]
Pokušavamo razbiti stvarno jednostavne CAPTCHA testove preuzete sa WordPress stranice.[6] Test se sastoji od 4 znaka koja su vrlo čitka tako da čovjek ne bi trebao imat nikakvih problema u rješavanju. Cijeli skup podataka sastoji se od 9955 slika.
Programski kod i skup podataka nalazi se na ovoj poveznici [8]
Korišteni alati:
Glavna ideja rješavanja problema može se svesti na 4 jednostavna koraka:
Za početak imamo čistu CAPTCHA sliku koju moramo obraditi.
Takva slika nije pogodna za rješavanje problema jer pikseli na rubovima nisu skroz crni kao unutar znakova. Zbog toga trebamo sliku pretvoriti u čisti crno-bijeli format, gdje sve što nije čisto bijelo postaje crno.
Sada vrlo lagano možemo detektirati rubove svakog znaka i pomoću funkcije findContours() iz biblioteka OpenCV-a, dijelimo sliku na četiri segmenta.
Ovdje vidimo da je segmentacija uspješno odvojila sva četiri znaka bez problema. No, što ako imamo znakove koji su slijepljeni jedan uz drugog. Takve znakove detektiramo tako što vidimo da je pravokutnik segmenta puno širi u x-osi nego što je u y-osi. Onda ga možemo podijeliti na pola i greška neće biti toliko primjetna, kao što bi bila da su znakovi spojeni ušli u test za učenje.
Nakon što se segmentiraju svi znakovi, stavljaju se zasebno u mapu sa ostalim znakovima koji su identično označeni. Za primjer imamo znak “W” u svojoj mapi.
Neuronska mreža ne treba biti presložena, ponajviše iz razloga što trebamo prepoznati samo jedan znak. Prepoznavanje znakova je puno lakši problem od prepoznavanja kompleksnijih slika kao što su slike pasa i mačaka. Zato se koristi jednostavna konvolucijska neuronska arhitektura mreže sa dva konvolucijska i dva potpuno povezana sloja.
Ovdje koristimo biblioteke Keras i TensorFlow, koji će nam u par linija koda napraviti cijelu neuronsku mrežu.
# Izgradi neuronsku mrežu model = Sequential() # Prvi konvolucijski sloj sa maksimalnim sažimanjem model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # Drugi konvolucijski sloj sa maksimalnim sažimanjem model.add(Conv2D(50, (5, 5), padding="same", activation="relu")) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) # Skriveni sloj sa 500 neurona model.add(Flatten()) model.add(Dense(500, activation="relu")) # Izlazni sloj sa 32 neurona za svaku klasifikaciju znaka model.add(Dense(32, activation="softmax")) # Definiranje funkcije gubitka, optimizacijskog algoritma i metrike model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
Nakon što smo definirali cijelu mrežu, sada ju sa dostupnim prethodno obrađenim podacima trebamo istrenirati.
# Treniranje neuronske mreže kroz 10 epoha model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=32, epochs=10, verbose=1)
Nakon 10 epoha točnost je iznosila približno 100%. Sada bi mogli mreži postaviti neviđeni primjer i vidjeti rezultat. Za očekivati je da će mreža klasificirati svaki znak ispravno te da će proći CAPTCHA test.
Vidimo da je mreža ispravno klasificirala svaki pojedini znak te da je CAPTCHA test uspješno riješen. Mreža ne bi trebala imati problema točno klasificirati sve znakove koji relativno podjednako izgledaju testovima nad kojima je mreža učila, čak i ako CAPTCHA test ima više znakova za pogoditi.
Iako je ova mreža gotovo točna 100% u rješavanju ovakvih jednostavnijih CAPTCHA testova. Sa razlogom možemo razumjeti zašto se ovakvi CAPTCHA testovi više ni ne koriste. Računalni sustavi za prepoznavanje ovakvih znakova daleko su napredovali pa ovakvi sustavi zaštite više nisu korisni. Zato se danas koriste puno složeniji CAPTCHA testovi, gdje prvo morate razumjeti kontekst problema, a onda ga riješiti na odgovarajući način. Znamo da računala teško mogu povezati semantiku nekoga teksta pa onda na temelju toga riješiti zadani problem. Nije nemoguće da će se u budućnosti takvi izazovi uspješno riješavati od strane računala, ali će se tada sigurno pojaviti nova vrsta CAPTCHA testova koja će zamijeniti starije ranjive CAPTCHA testove.
[1] CAPTCHA wiki.org
[2] captcha.net
[3] Panda Security What is Captcha?
[4] How CAPTCHAs Work | What Does CAPTCHA Mean?
[5] Breaking CAPTCHA Using Machine Learning in 0.05 Seconds
[6] Really Simple CAPTCHA By Takayuki Miyoshi
[7] TensorFlow
[8] How to break a CAPTCHA system in 15 minutes with Machine Learning Code
[9] «Build it & Break it»: How some algorithms generate captcha, while others crack it
[11] OpenCV
[12] Keras