Hur upptäcker skrivtest fusk? Så kontrollerar vi vårt

Skrivtest upptäcker fusk genom att kontrollera tangentloggen bakom varje resultat. Vårt räknar om varje resultat från tangentloggen, kontrollerar en hash, testar loggens struktur och timing, och håller varje tidsatt resultat över 130 WPM vars timing dessutom ser ovanlig ut borta från de offentliga listorna tills du klarar ett omtest. Timingkontrollerna fångar slarviga bottar; omtestet tvingar en noggrann bot att göra om alltihop.

Den första bot som slog våra timingkontroller var vår egen.

Vår hjälpfunktion för end-to-end-tester tryckte på tangenter med ett fast intervall på 40 ms, för det är vad ett testskript gör. Servern räknade om resultatet, bekräftade hashen och bedömde körningen som misstänkt: ingen variation mellan tangenttrycken, ingen rollover, identiska hålltider. Vi fick lägga till slumpmässigt jitter per ord och enstaka ”tankepauser” på 80 till 300 ms innan vår egen testsvit kunde skicka in ett resultat som såg mänskligt ut. Alternativet finns kvar i koden, med namnet humanLike.

Kontrollerna fungerar mot allt som inte anstränger sig, och allt som anstränger sig kan klara dem, så konstruktionen lägger den verkliga tyngden på ett omtest.

Steg ett: räkna om allt

Din webbläsare skickar inte någon WPM till oss. Den skickar tangentloggen (varje keydown-, keyup-, input- och composition-händelse, tidsstämplad med den monotona klockan performance.now()), de mätvärden den räknade ut och en SHA-256-hash av det kanoniska resultatet.

Servern kör samma mätkod på loggen och jämför. Skiljer sig någon siffra med mer än 0,01 avvisas resultatet som metrics_mismatch. Stämmer inte hashen avvisas det som hash_mismatch. Ett webbläsartillägg som ändrar WPM-fältet, det vanligaste fusket på sajter som litar på klienten, faller här. Samma funktioner tar fram siffran på din skärm och i databasen, och därför kan vår sida om mätvärden lova att dess räkneexempel går att återskapa med två decimaler.

Varför inte ta tid på testet på servern? Då skulle ditt resultat inkludera nätverket. Varje tangenttryck skulle nå oss lite sent, med en fördröjning som varierar med din uppkoppling, och en snabb skrivare på en långsam linje skulle förlora hastighet som hen faktiskt hade. Loggen ger oss klientens klocka för noggrannheten och serverns omräkning för ärligheten.

Steg två: går loggen ihop?

Före all timinganalys kommer enkla kontroller av inskickningens form:

  • Testet måste pågå i minst 15 sekunder eller 10 ord. Kortare körningar är för brusiga för att rankas och lättast att blåsa upp.
  • Ett resultat kan inte komma in innan testet kunde ha blivit klart: starttiden plus testets egen längd. Ett 60-sekundersresultat som kommer in tjugo sekunder efter starten har inte hänt.
  • Antalet händelser måste stämma med antalet skrivna tecken.
  • På dator måste varje input-händelse följa på en keydown inom 50 ms. Det fångar inklistrad text, skriptade input-händelser och de flesta verktyg för att injicera tangenttryck, som skickar text utan en fysisk tangent. Skrivande via en inmatningsmetod (IME-komposition) är undantaget, och mobilresultat hålls borta från de offentliga listorna.
  • En logg utan start, utan slut eller med icke-monotona tidsstämplar är felformad och avvisas direkt.

Inget av detta är listigt, men det tar bort det mesta av volymen.

Steg tre: vad kan tangenttimingen avslöja?

Det här är den del vi medvetet inte dokumenterar helt: listan över egenskaper är offentlig, gränsvärdena och vikterna är det inte. Ett publicerat gränsvärde är en måltavla. Om vi skrev ”en standardavvikelse under N millisekunder flaggas” skulle nästa version av varje skript lägga till N plus ett. Egenskaperna vi poängsätter:

Det genomsnittliga mellanrummet mellan tangenter och hur mycket det varierar. Mänskligt skrivande är oregelbundet. I Dhakal och kollegors studie från 2018 av 168 960 skrivare var det genomsnittliga intervallet mellan tangenttryck ungefär 239 ms med en standardavvikelse på ungefär 112 ms. Ett skript som skriver med fast intervall har nästan ingen variation; en studie på arXiv 2025 av en tangenttrycksbaserad CAPTCHA såg just det hos sin testbot, som skrev med en fast fördröjning på 50 ms. Det här är vår starkaste signal, och den som vår hjälpfunktion löste ut.

Andelen mellanrum under 40 ms. Ett mellanrum på 40 ms, hållet över tid, är 1 500 tecken i minuten, eller 300 WPM med fem tecken per ord. Fingrar ger visserligen enstaka så korta mellanrum när de överlappar tangenter vid rollover, så ett kort mellanrum betyder ingenting. En logg där en stor andel av mellanrummen är så korta är inte skrivande.

Hålltider för tangenter. Riktiga fingrar varierar med tiotals millisekunder; syntetiska händelser har ofta identiska eller nästan obefintliga hålltider, eftersom verktyget skickar keydown och keyup direkt efter varandra.

Rolloverandel. Hur ofta nästa tangent går ned innan den förra kommer upp. Dhakal mätte en genomsnittlig rolloverandel på 25 %, där de flesta snabba skrivare gjorde rollover på 40 till 70 % av tangenttrycken, och tangenterna överlappade med i genomsnitt 30 ms. Långsamma skrivare använder nästan ingen, så ett snabbt resultat utan rollover sticker ut. Bottar överlappar sällan tangenter.

Längsta pausen, hastighetssvängningar från sekund till sekund och andelen mellanrum över en sekund. Människor tvekar på sätt som ett skript måste bli tillsagt att härma.

En poängmodell väger samman dessa och kan flagga ett resultat som misstänkt. Under 130 WPM avvisar en flagga ingenting på egen hand. Ditt resultat döljs aldrig för dig; de här kontrollerna avgör bara om det rankas.

Kan fusk på skrivtest ta sig förbi timingkontrollerna?

Ja, om fusket är byggt med omsorg. En artikel av David Condrey på arXiv från januari 2026 testade detektorer för tangenttiming som ska skilja text skriven av människor från AI-genererad text. De skilde ut helt automatiserad injicering felfritt, men attacker med mänsklig timing (en person som skriver av AI-text, eller ett program som hämtar fördröjningar ur data från mänskligt skrivande) undgick alla fem klassificerarna i minst 99,8 % av fallen. Artikeln handlar om att avgöra vem som skrivit en text, inte om skrivtest, men lärdomen går att överföra: steg tre fångar de slarviga och inte mycket mer.

Vår egen hjälpfunktion för tester visar samma sak i liten skala: slumpmässigt jitter och några pauser flyttade den från uppenbart syntetisk till trovärdig.

Steg tre är alltså ett filter. Domen kommer från steg fyra.

Steg fyra: verifieringstestet

Om ett tidsatt resultat ligger över 130 WPM och timingen dessutom ser ovanlig ut ser du det och det sparas, men det hålls borta från de offentliga listorna tills du klarar ett verifierande omtest. Det är ett nytt test på 30 sekunder, och du måste nå minst 75 % av den hastighet du gjorde anspråk på. En tillfällig lyckträff eller en lånad logg överlever inte en andra körning.

Varför 130 WPM? Det är ungefär två och en halv gång medelvärdet på 51,56 WPM i Dhakals data, långt över de flesta skrivare, och den som verkligen skriver så snabbt kan göra det två gånger. Ett plötsligt snabbt resultat med konstig timing är precis den form en lånad logg eller ett skript ger, och om det är ärligt är ett extra test ett litet pris.

Omtestet är ett vanligt skrivtest, med vanlig text, inte en förvrängd bild eller en sida med konstiga symboler. Svårläst text gör alla långsammare, och de som blir mest långsammare är just de ärliga snabba skrivare som omtestet finns till för att godkänna. En verifiering som ärliga snabba skrivare inte klarar är sämre än ingen alls. Vanlig text gör också kontrollen rättvis: omtestets egen logg går igenom samma timingkontroller som alla andra resultat.

Begränsningar och avstängningar

Inskickningarna är begränsade: trettio i minuten per inloggad användare, sextio per IP-adress. Ett konto som gång på gång löser ut kontrollerna skuggbannas, alltså döljs tyst från listorna, och tre allvarliga fuskhändelser inom 24 timmar utlöser det automatiskt. Att räkna händelser inom ett tidsfönster gör att ett enstaka konstigt resultat aldrig kostar dig ett konto, medan ett skript som misslyckas om och om igen stoppas snabbt.

Topplistorna för all tid kräver dessutom 30 minuters skrivande på kontot, så ett nytt konto med en enda perfekt körning kan inte toppa dem.

Det som flaggar dig av misstag

De flesta flaggade resultat är inte fusk. De ärliga sätten att lösa ut en kontroll:

Autokorrigering på mobilen. En ersättning kommer in som en enda input-händelse som ändrar flera tecken. Vi räknar den som ett tangenttryck, flaggar den och håller resultatet borta från de offentliga listorna med en notering, inte med ett avvisande.

Inklistrad text. Inklistring är blockerad, och ett resultat där det försöktes utesluts från listorna.

Byte av flik. Lämnar fokus sidan i mer än två sekunder under ett test markeras det som avbrutet; det sparas och visas men rankas inte.

Pauser. Ett mellanrum på över fem sekunder i ett ord- eller citattest markerar resultatet som pausat. Samma behandling.

IME-komposition. Japansk, koreansk och kinesisk inmatning kommer in via composition-händelser, så vi hoppar över keydown-regeln för dem. Ser något ändå fel ut är det en bugg, och då vill vi gärna ha loggen.

Resultat offline. Ett resultat som synkroniseras mer än tio minuter efter att det blev klart ligger kvar i din historik utan rankning, eftersom vi inte kan validera dess klocka.

Att verkligen vara snabb. Över 130 WPM möter du omtestet, troligen på din första riktigt bra dag.

Så överklagar du

Varje uteslutning visar sitt skäl i din historik. Tror du att vi har fel om ett resultat eller en begränsning, mejla överklagandeadressen på vår sida om fuskskydd från adressen på ditt konto, med länken till resultatet eller datum och tid för testet. En människa tittar på tangentreprisen och svarar inom några dagar. Överklaganden avgörs aldrig av den automatiska modellen ensam.

Har vi just publicerat en instruktion för hur man klarar kontrollerna? Delvis. Listan över egenskaper gick alltid att lista ut från beteendet, och gränsvärdena förblir hemliga. Omtestet är den del som spelar roll, och sättet att klara det är att skriva.

Vanliga frågor

Hur upptäcker skrivtest bottar?

Bra skrivtest läser tangentloggen: om varje tecken har ett tangenttryck bakom sig, hur mycket mellanrummen mellan tangenterna varierar, och hur tangenterna hålls och överlappar. Skript tenderar att vara för regelbundna; noggranna bottar kan härma människor, och därför lägger vi till ett omtest.

Kan en bot klara ett skrivtests fuskskydd?

En noggrann bot kan klara timingkontrollerna: forskning om detektorer för tangenttiming fann att förfalskad människolik timing undgick dem nästan varje gång. Därför håller vi snabba resultat i väntan på ett omtest, som en bot måste klara en gång till med en andra logg som går igenom samma kontroller.

Varför rankades inte mitt resultat på skrivtestet?

Oftast ett test under 15 sekunder eller 10 ord, en paus över fem sekunder, ett flikbyte eller ett resultat över 130 WPM som väntar på sitt omtest. Din historik visar skälet.

Källor