Tři různé věci, kterým lidé říkají „ověření"
To slovo pokrývá žebřík a každý příčel odpovídá na jinou otázku.
Má tohle spojení skutečný Minecraft účet? Odpovídá na to kontrola na session serverech, kterou hra sama v online módu používá. Projít jí vyžaduje skutečný, aktuálně přihlášený účet — něco, co botnet nepředstírá a levně ve velkém nekoupí.
Je tady člověk? Vlastnictví účtu se dá koupit ve velkém, takže vážný útočník s hromadou pravých účtů projde prvním příčlem bez zpomalení. Příčel nad ním chce po člověku něco, co člověk zvládne triviálně a skript draze.
Je to pořád klient? Obojí výše je jednorázová cena. Chovat se celou session jako Minecraft klient je cena průběžná — viz Bot útoky na Minecraft server.
Proč musí mít kontrola účtu rozpočet a selhávat směrem k propuštění
Kontrola session je nejdražší věc v přihlašovací cestě, protože je to HTTPS dotaz na třetí stranu. Plynou z toho dvě pravidla a obě jsou o tom, aby se z obrany nestala slabina.
Rozpočtovat ji na adresu. Flood nesmí z vaší ochrany udělat generátor zátěže proti session serverům Mojangu. Kdo útočí na vás, nesmí být schopen přimět vás útočit na někoho jiného.
Při nedostupnosti selhat směrem k propuštění. Dlouhodobý výpadek session serverů má úroveň ověření degradovat, ne zamknout všechny hráče venku. Výpadek Mojangu, který se stane vaším výpadkem, je horší selhání než krátkodobé vpuštění neověřeného hráče — vaši komunitu nezajímá, čí to byla chyba.
Proč se webové postupy CAPTCHA nepřenášejí
Instinkt je zdeformovat text a nechat hráče ho přečíst. V Minecraftu je to skoro k ničemu a ten důvod stojí za pochopení, protože se dá zobecnit.
Nejpřirozenějším místem, kam kód nakreslit, je vyplněná mapa, kterou hra vykresluje jako mřížku barevných indexů. Ta mřížka dorazí ke klientovi jako malý blok prostých bajtů palety. Nic z ní se nemusí vykreslit, aby se dala přečíst: skriptovaný klient vidí přesně tu samou mřížku jako hráč, jen bez očí v cestě. Není za co se schovat a není co otiskovat.
Deformovat znaky je proto špatná páka. Deformace dost silná na to, aby uškodila klasifikátoru, uškodí unavenému člověku čtoucímu pět znaků přinejmenším stejně — a klasifikátor je ten, kdo si smí zdarma zkusit znovu. CAPTCHA, kterou poctivý hráč neprojde, není silná CAPTCHA, je to výpadek s mezikrokem: zkusí to znovu, dostane další nečitelný obrázek a odejde, zatímco solver zkouší dál a nic ho to nestojí.
Co solvera opravdu něco stojí
Když nejde znaky ztížit k rozpoznání, aniž by to víc ublížilo hráčům, musí se cena přesunout tam, kde ji člověk platí zdarma a skript ne.
Výběr podle vlastnosti, kterou člověk zpracuje preatentivně. Rozhodnout, které znaky se počítají, barvou a tu barvu pojmenovat v zadání je pro člověka skoro zadarmo — vybrat barvu z pole se odehrává pod úrovní čtení. Solver musí rozparsovat text zadání, namapovat slovo pro barvu na index palety a teprve pak segmentovat obraz.
Nízkokontrastní návnady. Značky pár odstínů od pozadí leží pod kontrastem, který člověk vůbec řeší, a pohodlně nad „pixel se liší od pozadí". Hráče to nestojí nic a spolehlivě to porazí přístup „zaprahovat všechno a spočítat skvrny", i když solvera filtrujícího podle přesného indexu to stojí málo. Je to levná vrstva, ne silná — a stojí za to říct nahlas, která vrstva je která.
Proměnlivost při každém vykreslení. Rozložení, která barva je klíčová i přesný tvar každého znaku se pokaždé losují znovu, takže práci nejde udělat jednou a uložit. Otočit znak kolem jeho vlastního středu člověka nestojí prakticky nic a zároveň to šablonovému porovnání sebere svislé osy, na kterých staví. Všimněte si kontrastu se zakrýváním nebo přerušováním tahů, které člověka stojí skutečný vjemový krok a vede k přečtení špatně — rozdíl mezi „neškodné člověku, nepřátelské porovnávači" a „nepřátelské oběma" je tady celé řemeslo.
Pořadí jako rozměr. Tohle je nejsilnější dostupná vrstva. Statický obrázek s pěti znaky je screenshot: jeden paket, jeden průchod rozpoznáním, uložený navždy. Když se místo toho znaky odhalují po jednom a odpovědí je pořadí, ve kterém se objevily, pak žádný jednotlivý paket odpověď nenese — ani první, ani poslední, ani žádný jiný. Sloučení snímků, což je zjevný první pokus, vrátí znaky a ztratí pořadí. Člověk sledující obrazovku dostane pořadí zdarma, protože čas je rozměr, který lidé mají a výpisy paketů ne.
Detail s párováním je důležitý a snadno se pokazí: každý krok musí odhalit víc než jeden znak a jen zadání říká, který se počítá. Kdyby se objevovaly pouze znaky odpovědi, solver by mohl obrázek úplně ignorovat a přečíst pakety v pořadí, jak dorazily.
Co dobrá výzva odmítá dělat
Žádná externí ověřovací služba. Výzva závislá na třetí straně zdědí každý její výpadek a sedí přímo na cestě, kterou se hráči přihlašují. Na webu je to špatný den; na přihlašovací cestě herního serveru je to server, který je dole.
Žádný mod, žádný plugin, nic k instalaci pro hráče. Cokoli, co vyžaduje instalaci, je ochrana, kterou většina vaší komunity ve chvíli potřeby mít nebude.
Žádné předstírání, že hráč musí mít placený účet, když server říká opak. Server, který záměrně pouští offline účty, nemůže po nikom chtít prokázat placený — kontrola by odmítla přesně ty hráče, které měla pustit. Potřebuje jiný příčel, a slabší je poctivý, dokud se jako slabší popisuje.
Prokázat člověka není totéž co prokázat, že se člověk dívá
Přečtení kódu dokazuje, že něco rozparsovalo paket. Protože obrázek přichází jako prosté bajty, skript bez vykreslování umí vyrobit správnou odpověď, aniž by kdy měl kameru nebo obrazovku.
Doplňkem je zkontrolovat části, které skriptovaný klient nemá důvod předstírat: pohnul se pohled skutečně k tomu, co se má číst, dostal se tam postupně místo jedním podvrženým skokem, byly kroky proměnlivé tak, jak je vyrábí ruka na myši, místo uniformní jako u lineárního přejetí — a pohnula se vůbec druhá osa, protože nikdo nedrží myš dokonale klidně v jedné ose.
Jedna návrhová poznámka je podstatná: nic z toho se nesmí posuzovat podle časování. Vanilla klient posílá tyhle aktualizace na vlastní pevný tick, takže intervaly skutečného hráče jsou stejně pravidelné jako u skriptu. Považovat pravidelné časování za podezřelé by nechalo propadnout všechny. Signálem jsou hodnoty, ne hodiny.
A nic z toho není nepodvrhnutelné, což je v pořádku — solver, který už řídí skutečného klienta, tím projde zadarmo. Zavírá to levnou cestu: číst bajty ze socketu, aniž by kdy existovala kamera. Právě tu cestu má smysl zavřít, protože je to ta, která škáluje na login flood.
Pamatovat si úspěšné ověření
Ověření stojí hráče čas a síť skutečnou práci, takže dělat ho při každém připojení by bylo neslušné i drahé. Úspěch se musí pamatovat — jako podepsaný token, který klient příště předloží, nebo, pro klienty příliš staré na to, aby ho uložili, jako hrubší vazba adresy a jména.
Dvě pravidla brání tomu, aby se z toho stala díra:
Vázat ho na server, kde byl získán. Token získaný na jednom serveru musí být na jiném bezcenný, jinak se útočník ověří jednou a je důvěryhodný na každém serveru v síti.
Dávat přesně jednu věc: přeskočení výzvy. Důvěra nesmí nikdy obcházet seznam banů, rate limity ani limit plánu. Je to optimalizace oproti opakovanému ověřování, ne privilegium.
Jedno znovupřipojení a proč
Ověřování, které probíhá před serverem, má strukturální výhodu, která tu cenu stojí. Když ochrana účet prokáže sama a pak hráče pošle zpět, aby se připojil znovu, server si nechá vlastní ověřování a nepotřebuje žádnou změnu konfigurace — a díra „uniklá adresa backendu dovolí komukoli připojit se pod libovolným jménem", která provází forwardovací proxy, se vůbec neotevře, protože si server dál ověřuje každého hráče sám.
Cenou je jedno znovupřipojení napoprvé. U moderních klientů je automatické a neviditelné; u klientů starších než 1.20.5 hráč jednou klikne na server znovu. To je poctivý obchod a je malý vedle serveru, jehož celý model identity závisí na tom, že nikdo nikdy nenajde jeho adresu.
Ochrana herních serverů od Itnetic tenhle žebřík staví před servery Java Edition, s výzvou kreslenou uvnitř hry a bez služby třetí strany na přihlašovací cestě.