Në një rast m'u desh të bëja disa procedura burokratike nëpërmjet internetit dhe duke qenë se faqja e internetit ishte e keqe, iu drejtova automatizimit, kështu që më duhej të gjeja një mënyrë për të anashkaluar një captcha dhe duke e bërë këtë zbulova disa gjëra që do t'i ndaj me ju. në këtë postim.

Këshillat e mëposhtme mund të duken mjaft të qarta, por nuk do ta shkruaja këtë postim nëse nuk do t'i kisha hasur këto gabime në një aplikacion "ndërmarrje". Kështu që unë mendoj se këto këshilla në fund të fundit mund të jenë të dobishme për dikë.

Megjithatë, ju lutemi vazhdoni të lexoni pasi mund ta gjeni interesant këtë postim pasi diskuton vizionin kompjuterik, inxhinierinë e kundërt, trajtimin e skedarëve të mëdhenj në Java dhe tema të tjera.

Mos përdorni kapëse të ngjashme me reCAPTCHA v1

Siç mund ta shihni nga imazhi më poshtë, captcha që synova të anashkaloja ishte shumë gjenerike dhe e thjeshtë.

Prandaj, ajo që më erdhi fillimisht në mendje ishte përdorimi i vizionit kompjuterik. Sidoqoftë, rezulton se anashkalimi i captcha ishte shumë më i lehtë dhe ne do ta diskutojmë atë në pjesën tjetër. Tani për tani, më lejoni t'ju tregoj se si vizioni kompjuterik mund të na kishte ndihmuar.

Fillimisht mendova për këtë: Le të themi se shkronjat kanë trashësi 3, ndërsa zhurma (ovale të rastësishme) kanë trashësi 1. Prandaj, nëse hiqni të gjitha figurat me trashësi 1, do të keni hequr zhurmën.

Unë mendoj se nuk ka asnjë operator OpenCV që e bën pikërisht këtë. Megjithatë, ne mund të mendojmë për këtë në një mënyrë tjetër: Zbrisni 1 nga trashësia e çdo figure gjeometrike në imazh dhe kjo do t'ju lërë me shkronja me trashësi 2 dhe zhurmë me trashësi 0. Pra, në thelb, ne heqim në mënyrë efektive zhurma.

Ky operacion ekziston në OpenCV dhe quhet "erozioni". Përdorimi i tij për të hequr zhurmën është mjaft i thjeshtë:

("Hapja" është një operacion që përdor fillimisht erozionin dhe më pas zgjerimin. Mund të kishim përdorur vetëm operatorin e erozionit, por kjo do të rezultonte në shkronja të trashësisë 2. Operatori i zgjerimit i bën ato përsëri me trashësi 3)

Kur ekzekutojmë skriptin me kampionin captcha si hyrje, marrim daljen e mëposhtme.

Siç mund ta shihni, imazhi është shumë më i qartë tani dhe ne mund të përdorim një OCR të tillë si tesseract për të nxjerrë personazhet.

E bukur! Sapo kemi gjetur një mënyrë për të anashkaluar këtë captcha të thjeshtë duke përdorur vizionin kompjuterik 😝. Nga kjo mund të nxjerrim mësimin e mëposhtëm:

Mos përdor captcha të ngjashme me reCAPTCHA v1. Ka një arsye pse Google e mbylli atë version.

Tani do të shohim se në fakt nuk kishte nevojë për të përdorur vizionin kompjuterik.

Vërtetoni përgjigjen CAPTCHA në backend

Për të anashkaluar captcha-n më duhej të dija burimin e saj. Pra, hapa skedën Rrjeti në DevTools dhe gjeta përgjigjen e mëposhtme nga serveri.

Vetia Captcha përmban imazhin captcha të koduar me bazë64, dhe vetia a përmban një varg gjashtëkëndor, qëllimi i të cilit nuk dihet për momentin.

Në të njëjtën kohë, zbulova një sjellje të pazakontë: hyrja captcha ishte reaktive dhe do t'ju shfaqte menjëherë një mesazh nëse captcha ishte e gabuar. Mendova se një kërkesë për të vërtetuar captcha-n u dërgua pas çdo ndryshimi të hyrjes, por kur shikova përsëri skedën Rrjeti në DevTools, vura re se nuk ishin bërë kërkesa të reja.

Kjo më bëri të mendoj se captcha ishte vërtetuar në anën time dhe prona a kishte të bënte me këtë. Pra, shikova kodin burimor (brenda DevTools në skedën Debugger) dhe kërkova për veçorinë a. Kjo është ajo që gjeta.

Siç mund ta shihni, në rreshtin 5 merret hash-i SHA1 për përgjigjen captcha nga përdoruesi, dhe në rreshtin 6 krahasohet me vetinë a nga përgjigja. Prandaj, vetia a është në fakt hash-i SHA1 i përgjigjes së saktë captcha.

Për shkak se SHA1 është një hash në një drejtim dhe është kaq e vështirë ta rikthejmë atë për të marrë përgjigjen e saktë të captcha, nuk mund të bëjmë shumë veçse të kryejmë një sulm me forcë brutale. E cila në thelb është mjaft e thjeshtë, do të na duhet vetëm të provojmë të gjitha kombinimet e mundshme.

Për të marrë të gjitha kombinimet e mundshme, duhet të dimë se captcha përbëhet nga 5 shkronja të vogla alfanumerike angleze (36 karaktere gjithsej) dhe lejohen përsëritjet (i zbulova këto kufizime pasi pashë kapça të shumta). Kështu, numri i përgjithshëm i mundësive është 60,466,176 (365)

Duket si shumë mundësi dhe mund të mendoni se është pothuajse e pamundur të provoni secilën prej tyre. Por në fakt është mjaft e thjeshtë për ta bërë këtë dhe nuk kërkon shumë kohë siç do ta shihni.

Sulm me forcë brutale

Kodi i mëposhtëm gjeneron të gjitha vlerat e mundshme të captcha dhe kryen sulmin me forcë brutale. Falë bibliotekave të përdorura, kodi është mjaft i thjeshtë. Megjithatë, shtova pak Javadoc për të lehtësuar leximin.

Metodat generate(Writer) dhe read(Reader): Iterator<Attempt> u shtuan thjesht për lehtësi për mua. Në rastin tim ishte më i përshtatshëm për të lexuar të gjitha 60,466,176 hash dhe captcha nga një skedar me madhësi ~2,7 GB, në vend që t'i gjeneroja ato menjëherë.

Sigurisht, leximi i një skedari 2.7 GB përmes një transmetimi është shumë më efikas sesa leximi i tërësisë së skedarit dhe ruajtja e tij në një listë (duke bërë këtë ndoshta do të shkaktonte një gabim OutOfMemory).

Vini re diçka të rëndësishme: Megjithëse ky është një sulm me forcë brutale, edhe nëse aplikacioni do të kishte një lloj kufizimi të normës, do të ishte i padobishëm (kontrolloni rreshtat 60 dhe 52 nga CaptchaCracker dhe ExamplePage, respektivisht). Kjo nuk do të ishte e vërtetë nëse vërtetimi bëhet në backend.

Prandaj, mësimi i mësuar këtu është që të mos vërtetoni përgjigjen CAPTCHA në front, por në fund, dhe nëse e bëni këtë,shtoni kufizimin e shpejtësisë për të parandaluar sulmet me forcë brutale. Ose thjesht përdorni një palë të tretë si reCAPTCHA nga Google.

konkluzioni

Unë mendoj se rekomandimet që dhashë këtu janë të dukshme dhe asgjë të veçantë, por siç u tha më parë, nuk do ta shkruaja këtë postim nëse nuk do të kisha hasur në këto dështime në një aplikacion "ndërmarrje".

Së fundi, do të doja të shtoja këtë fakt kurioz dhe ironik: ndërmarrja përgjegjëse për këtë aplikacion punëson vetëm profesionistë të autorizuar.

Thënë kështu, nuk më mbetet gjë tjetër veçse t'ju falënderoj për leximin e këtij postimi, dhe si gjithmonë, nëse mendoni se diçka nuk shkon ose diçka mund të përmirësohet, ju lutem më njoftoni. Do të doja komentet tuaja.

Shtojca A: Përgjimi i përgjigjes së kërkesës captcha me Selenium

Faqja e internetit funksionoi si më poshtë:

  1. Përdoruesit iu kërkua të fuste disa të dhëna në një formë
  2. Kur plotësoheshin të gjitha fushat e kërkuara, u bë një kërkesë në backend për të marrë imazhin captcha dhe hash-in SHA1 (përgjigja që pamë në seksionin e mëparshëm)
  3. Ju nuk mund të shkoni në faqen tjetër derisa captcha të zgjidhej me sukses

Siç mund ta shihni, imazhi captcha dhe hash nuk janë ngarkuar që në fillim, kështu që ne duhet të përgjojmë përgjigjen për një kërkesë të bërë në mënyrë asinkrone. Për ta bërë këtë, përdora kodin e mëposhtëm.

Kodi është pothuajse vetë-shpjegues, por mund të ndihmojë për të sqaruar se në rreshtin 45, ekzekutimi do të ndalet derisa një objekt të vendoset në rreshtin 80 (gjë që ndodh në mënyrë asinkrone pasi të merret përgjigja nga serveri).

E di që kjo nuk ka pothuajse asnjë lidhje me rekomandimet se si të mos shtohet captcha në një faqe interneti, por doja ta përfshija atë pasi mund të ndihmojë dikë, ose ndoshta vetëm veten time të ardhshme.