CAPTCHA’s en accessibility: spam bots op hun eigen zwakte pakken

Geschreven op 2007-06-06 • gesprek (5)

De CAPTCHA. Het moest dé revolutionaire methode worden om spambots tegen te houden. Ongewenste berichten op blogs, vervelende e-mails, automatische registraties op forums, het zou allemaal verleden tijd worden met deze nieuwe techniek.

De opzet is eenvoudig: een computergegenereerde afbeelding toont een letter- of cijfercombinatie, die de gebruiker dan moet invoeren in het daarvoor voorziene veld. Op die manier wordt er geverifieerd of de gebruiker een geautomatiseerde bot is, of een mens. Immers, een bot kan geen afbeeldingen lezen en een mens wel. Althans, dat was de idee erachter.

Onlangs is echter gebleken dat CAPTCHA’s nogal redelijk makkelijk te kraken zijn. Door bots dus. Via een techniek die we Optical Character Recognition noemen kan een bot de letters van een afbeelding uitlezen. Zoals aangetoond door het OCR Research Team zijn zelfs sommige van de meer ingewikkelde CAPTCHA’s makkelijk te kraken. Greg Mori en Jitandra Malik beschrijven in hun artikel “Breaking a Visual CAPTCHA“ hoe dat precies in z’n werk gaat.

Niet alleen is een CAPTCHA dus een achterhaalde en redelijk zwakke techniek, het is bovendien heel gebruikeronvriendelijk. Om te beginnen is het een extra stap in het verzenden van een bericht of het registreren van een account. Een stap die de gebruiker eigenlijk koud laat en vaak als overbodig of zelfs storend ervaart. Hoe vaak heeft u immers al niet de verkeerde code ingevoerd, waarbij u terug moest keren naar de volgende pagina. Tot overmaat van ramp bleken de invoervelden dan nog eens gewist te zijn, waardoor u helemaal van nul moest beginnen. Vervelend is zacht uitgedrukt.

Ten tweede—en dat is minstens zo belangrijk—hebben blinden, kleurenblinden en slechtzienden vaak de grootste moeite om die CAPTCHA te lezen. Voor een blinde surfer is het bijna helemaal onmogelijk—of zijn software moest gebruik maken van OCR, maar het mag duidelijk zijn dat dat de hele idee van een CAPTCHA overbodig maakt. Voor iemand die kleurenblind is, is het vaak vervelend als er bijvoorbeeld met een achtergrond gewerkt wordt waardoor de voorgrond niet meer te onderscheiden is—dus de tekens niet meer leesbaar zijn. Iemand die slechtziend is ten slotte, zal er niet veel aan hebben om de tekstgrootte in zijn browser aan te passen: het gaat om een afbeelding waarvan de afmetingen exact bepaald zijn. Met uitzondering van enkele weinig gebruikte webbrowsers wordt inzoomen op dit beeld dus onmogelijk.

Daarom ben ik dan ook resoluut tegen CAPTCHA’s. Ik heb ze vroeger wel in websites geïmplementeerd, maar ik voelde weldegelijk aan dat het niet om een definitieve oplossing kon gaan. Ik heb de alternatieven onderzocht en vergeleken. Zo is het bijvoorbeeld mogelijk om tekstueel, via een javascript, een boodschap te laten verschijnen die vraagt om een eenvoudige rekensom op te lossen. Het probleem daar is echter van bijna dezelfde orde als bij andere CAPTCHA’s. Er is een extra struikelblok om een actie te ondernemen en een blinde zal de oplossing niet kunnen geven, om de eenvoudige reden dat JavaScript niet automatisch uitgevoerd wordt door de browser die blinde surfers gebruiken.

Ik ben op zoek gegaan naar een andere oplossing. Ik ben vertrokken vanuit de redenering dat je met spambots hetzelfde moet doen, als wat zij met ons doen: je moet ze op hun zwakte pakken. En een van die zwaktes is dat een spambot niet kan nadenken—voorlopig althans nog niet. De oplossing die ik gevonden heb is gebruikervriendelijk en perfect toegankelijk.

Spambots vullen automatisch formuliervelden in. Omdat ze echter vaak niet kunnen weten wat ze waar juist moeten invullen, vullen ze lukraak alle velden in met hun spambericht. Dit met uitzondering van velden met bijvoorbeeld een id “name” of “e-mail”. De idee is dus: als er iets of iemand een veld invult dat een surfer niet kan zien, dan gaat het om een automatisch ingevuld veld. In ons formulier voegen we dus een “nutteloos” veld toe:

<label for="txtURL" class="h">Vul dit veld niet in als u een mens bent. Zo helpt u mee in de strijd tegen spam.</label> <input name="txtURL" type="text" class="h" value="">

In ons stijlblad (CSS) gaan we de velden met bijvoorbeeld klasse “h” verbergen voor de bots. Ik stel voor om een klasse te gebruiken die je niet “hidden” noemt, of waaruit een bot niet kan afleiden dat het om een verborgen veld gaat. Een eenvoudige display: none; zou het veld voor blinden, maar ook voor sommige slimmere spambots verbergen. Als we echter met positionering werken, iets waar een “blindenbrowser” of spambot geen rekening mee houdt, kunnen we de velden virtueel van het scherm positioneren. Het moet voor een blinde surfer wel duidelijk zijn dat hij het veld niet mag invullen. Hiervoor heb ik gezorgd door tussen de <label>-tags een juiste omschrijving te zetten. Iets wat je trouwens altijd zou moeten doen als je werkt met formulieren.

.h {position: absolute; top: -9999px; left: -9999px;}

Als we nu bijvoorbeeld via een php-functie controleren of het veld al dan niet ingevuld is, kunnen we gemakkelijk op basis daarvan een foutmelding weergeven of de echte post-actie laten doorgaan.

if ($_POST['txtURL']!="") { ...functie... }

Ik gebruik deze functie onder andere om het gastenboek van de U&Me website tegen spambots te beschermen en het werkt als geen ander. Ik ga het stap voor stap ook in andere websites implementeren.

Wat ik echter wel nog moet meegeven is dat dit, zoals altijd, geen wonderoplossing is. Voor grote pakketten als Wordpress is het niet zinvol om dit extra veld toe te voegen: spammers leren ook. Ze kunnen gemakkelijk hun spambots zo configureren dat er bij een wordpress installatie maar een bepaald aantal velden ingevuld wordt, bijvoorbeeld. Voor custom made inhoudbeheersystemen (CMS) is het volgens mij echter een ideale oplossing. Help free the world of spam. Spread the word.

Conversation is closed

Conversations close automatically after six weeks. Feel free to contact me directly if you have feedback on this article.

Knap gevonden!
Vullen spambots altijd alle velden in? Zoniet, dan is het niet helemaal waterdicht, maar toch al een serieuze drempel. Het mooie eraan vind ik dat de gewone gebruiker er niets van hoeft te merken.

E

Michiel · Tue 5 Feb 2008 · #

Het is niet helemaal waterdicht, maar ik denk dat ik nog een aanvullend artikeltje ga schrijven. Via een combinatie van enkele methodes is het vrij waterdicht. En af en toe zal er wel eentje door de mazen van het net glippen, maar dat is bij elke spam-protection wel zo, denk ik. Af en toe handmatig een reactie verwijderen is dan ook geen ramp :).

Wat dat van die blinde surfers betreft: ik ben het er vergeten in te zetten, maar spambots lezen vaak, net als een blindenbrowser, dat een bepaald veld “hidden” is in het stijlblad. Ik ga het artikel hier en daar nog wat finetunen :). Bedankt voor je opmerking!

Xavez · Tue 5 Feb 2008 · #

Ik ga bovenstaande zeker uit proberen.

Kunnen spambots ook radio buttons aanvinken?
Zo niet, dan zou je ook gewoon een radio button aan je formulier kunnen toevoegen met de tekst in de trend van “bent u een mens?”

Zolang de radio button dan niet aangevinkt is wordt het formulier niet verzonden.

marcel · Tue 26 May 2009 · #

Ik vermoed dat spambots inderdaad radio buttons kunnen aanvinken, maar ik durf het niet met zekerheid te zeggen.

Feit is dat het dan nog steeds een actie van de gebruiker vereist om aan te geven dat hij een mens is en het is net dat, wat ik wil vermijden!

Xavier · Wed 27 May 2009 · #

Ja, die bots kunnen radio buttons lezen en manipuleren.

Ik vind die velden techniek goed.

Je kan het bots nog wat lastiger maken, door meerdere velden te gebruiken.

Edwin Waelbers · Tue 20 Jul 2010 · #