Index

Captcha:
toegangsbeveiliging door middel van een kode in een jpeg

Veronderstel dat je een forum of een ander medium hebt waar mensen hun bijdragen kunnen plaatsen. Indien je geen beveiligingsmaatregelen neemt, is het forum binnen de korste keren aangetast door spambijdragen. Deze spambijdragen zijn door robots aangemaakt, die op zoek gaan naar websites waar een forum aanwezig is (ze kunnen dat achterhalen door de source van de pagina te bekijken). Een toegangscontrole is noodzakelijk: de eenvoudigste manier is door een toegangskode in een jpeg te schrijven (spamrobotten kunnen de tekst in de jpeg nog niet verwerken).

Spamberichten die door een toegangscontrole op n van mijn sites tegengehouden zijn geweest kan u hier aantreffen. Het toegepaste systeem moest zo onopvallend mogelijk zijn (om mensen niet te ontmoedigen een bijdrage te schrijven): van registratie, username, login en passwoord mocht er dus geen sprake zijn. Zoals u ziet loont het de moeite een toegangscontrole in te stellen!

JPEG kwaliteit: 1
JPEG kwaliteit: 3
JPEG kwaliteit: 5
JPEG kwaliteit: 7
JPEG kwaliteit: 9
JPEG kwaliteit: 11

De realisatie is poepsimpel, en we gaan zelfs de beperkingen van jpeg gebruiken om het decoderen door robotten extra moeilijk maken.

JPEG kwaliteit: 1
JPEG kwaliteit: 3
JPEG kwaliteit: 5
JPEG kwaliteit: 7
JPEG kwaliteit: 9
JPEG kwaliteit: 11

Er zijn toegangscontrole-programma's die vervormde letters genereren. Dit kan veel eenvoudiger en met minder bandbreedte door gewoon het beeld sterk te comprimeren! Naargelang de compressie is iedere jpg in dit voorbeeld 1490 1745 bytes groot.

Ondertussen zijn er al een paar Captcha-algoritmen gekraakt: iets dat je zelf schrijft zal in ieder geval niet zo snel gekraakt worden! Een achtergrond met een gradient en/of valse tekens (die zelfs niet op letters moeten lijken) blijken bijzonder moeilijk te kraken. Gewoon de aanwezigheid van een captcha is meestal voldoende om je site te beveiligen tegen ongewenste bezoekers (robotten) die spam in het forum achterlaten. Het kraken van je algoritme loont niet de moeite, en het is dus niet nodig een nagenoeg onleesbare captcha op je site te plaatsen. Je doet de gebruikers geen gunst door een beeld te gebruiken dat bijna niet te lezen is.

Dit is de kode om een captcha aan te maken en door te sturen:


    RANDOMIZE
    ran$ = FORMAT$(RND(1, 999999), "000000")
    a$ = "d:\jpgconv\jpgconv d:\images\pass.jpg f:\j.jpg 10 100 s " + $DQ + "+" + ran$ + "+" + $DQ + " " + $DQ + "COMIC"_
         + $DQ + " 15 0,0,0 224,224,224 c c, 0,1,0"
    SHELL a$
    OPEN "f:\pass.txt" FOR OUTPUT AS #2: PRINT #2, ran$: CLOSE           ' We slaan de gegenereerde kode op in een bestand om die
    OPEN "f:\j.jpg" FOR BINARY AS #1: i = LOF(1): GET$#1, i, a$: CLOSE   ' later te vergelijken met wat de bezoeker ingevuld heeft.
    OPEN ENVIRON$("CGI_STDOUT") FOR OUTPUT AS #3                         ' Dan maken we ons outputbestand aan
    PRINT #3, "HTTP/1.0 200 OK                                           ' We gebruiken NPH (non-parsed headers)
    PRINT #3, "Content-Type: image/jpeg                                  ' om aan te geven dat het bestand een JPG is.
    print #3, "Cache-Control: no-cache                                   ' On te vermijden dat de browser het bestand in zijn cache zou opnemen
    PRINT #3, "Content-Length:" i                                        ' en de bezoeker dus een verlopen beeld zou tonen.
    PRINT #3,
    PRINT #3, a$
    CLOSE

Dit is alles! jpgconv kan u hier aantreffen. Gewoon uitpakken en gebruiken! (d'er staat een korte handleiding in de zip).
Spelen met de parameters van jpgconv kan u in deze zandbak doen!
Voor mensen die slecht een beperkte kennis van programmeren hebben is er een eenvoudig captcha-alternatief dat in de meeste gevallen volstaat.

Forceren van een reload

Indien je een dynamisch gegenereerde captcha gebruikt voor toegangscontrole, dat moet iedere keer dat de pagina bezocht wordt het beeld binnengehaand worden. De internet browser mag het beeld dus niet in zijn cache opnemen. Dit kan op twee manieren gebeuren:

Captcha?

Captcha staat voor Completely Automated Public Turingtest to tell Computers and Humans Apart. Een Turingtest is een test om na te zien of een computer kan doorgaan voor een mens: in de praktijk een conversatie voeren en een onderzoeker kan uitgaande op de transcripten niet achterhalen wie de computer is en wie de mens. De test met de vervormde jpeg in een goede graadmeter om na te zien of we te maken hebben met een 'bot' of een echte mens die zich op het forum inschrijft.

Taggen van files

Een andere toepassing van jpgconv is het taggen van files (copyright plaatsen op foto's die online gepubliceerd worden). Om een volledige directory te taggen gebruik je de dos command FOR
FOR %a IN (*.jpg) DO d:\jpgconv %a result/%a ....

Het effekt is natuurlijk niet zo mooi als wat je met photoshop kan bekomen (emboss effekt), maar voor een snelle en eenvoudige batchverwerking kan het voldoende zijn.
De compressiealgorithme van JPGCONV is ook niet ideaal: een file van bijvoorbeeld 100 kb door JPGCONV aangemaakt zal meer compressieartefakten vertonen dan een file van dezelfde grotte gecomprimeerd door photoshop.

Index

Individuele landingspage bezoekers: