I wrote this script many years ago when I needed a simple CAPTCHA generator for use with the classic ASP ASPJpeg component. At the time it received a lot of interest and while obviously almost obsolete these days, I have posted it for anyone looking for something like this. If you’re thinking of making the jump to PHP – which I have – I thoroughly recommend this book: Beginning PHP4 (Programmer to Programmer) – clear and programming oriented (none of the waffle you see in other beginner books).
Note: If you’re working with ASP components, you might find my Classic ASP Component Detection Script useful.
The Classic ASP Code
Simply save this code in an ASP file using whatever file name you prefer – I generally save it in a file called imageVerification.asp – we will call this as an image using (see the form example below). When a page loads and calls this script, it generates an image on the fly and stores the code that is displayed in that image in a session variable called verificationCode – this can then be evaluated on whatever script/page your form submits too.
'############################################# '#SPARKLY IMAGE VERIFICATION VIA ASPJPEG V1.1# '############################################# 'Written by Bob McKay, please leave copyright intact. 'Copyright Bob McKay 2009. All Rights Reserved. 'Visit www.northumberlandwebdesign.com for Updates. '*************** CODE BOX OPTIONS *************** codeBoxWidth = 120 codeBoxHeight = 40 numberOfLetters = 4 ' Allow Minimum 20 Pixels Per Letter - See codeBoxWidth Property Above) wantBorderRoundCodeBox = TRUE ' Put a Border Round the code box(MUST be TRUE or FALSE) borderRoundCodeBoxColor = "&HBED2E9" backGroundColor = "&HF0F5FB" codeFontColor = "&H666666" numbersAllowedInCode = FALSE' Set to FALSE for a 'Letters Only' Code 'The fonts the script is allowed to select from - these MUST be installed on the Host computer hostFontList = Array("Arial", "Courier New", "Helvetica", "Times New Roman", "Georgia", "Comic Sans MS") minimumFontSize = 24 maximumFontSize = 32 randomUnderLined = FALSE' Randomly underline letters for extra distortion '*************** DISTORTION OPTIONS *************** codeImageJPGQuality = 15' Lower this to allow JPG distortion of the codeBox multiColorLinesOnTop = TRUE' If set to FALSE, ON TOP line color defaults to code font color numberOfLongLinesOnTop = 0' Number of end to end lines drawn ON TOP of the code numberOfRandomLinesOnTop = 0' Number small lines drawn ON TOP of the code multiColorLinesUnderneath = TRUE' If set to FALSE, UNDERNEATH line color defaults to code font color numberOfRandomLinesUnderneath = 2' Number small lines drawn UNDERNEATH of the code '*************** FUNCTIONS & SUBROUTINES *************** SUB drawBorderRoundBox aspJpegImageObject.Canvas.Brush.Solid = FALSE ' Do NOT fill box with color when drawing aspJpegImageObject.Canvas.Pen.Color = borderRoundCodeBoxColor aspJpegImageObject.Canvas.DrawBar 0, 0, codeBoxWidth, codeBoxHeight END SUB SUB drawLines(numberOflongLines, numberOfShortLines, randomLineColor) aspJpegImageObject.Canvas.Pen.Color = codeFontColor FOR drawLongLines = 1 TO numberOflongLines IF randomLineColor = TRUE THEN aspJpegImageObject.Canvas.Pen.Color = "&H" & HEX(INT(RND*255)) & HEX(INT(RND*255)) & HEX(INT(RND*255)) aspJpegImageObject.Canvas.DrawLine 5, INT(RND * 35), (codeBoxWidth - 5), INT(RND * 35) NEXT FOR drawShortLines = 1 TO numberOfShortLines IF randomLineColor = TRUE THEN aspJpegImageObject.Canvas.Pen.Color = "&H" & HEX(INT(RND*255)) & HEX(INT(RND*255)) & HEX(INT(RND*255)) aspJpegImageObject.Canvas.DrawLine INT(RND*codeBoxWidth)+1, INT(RND * 35), INT(RND*codeBoxWidth)+1, INT(RND * 35) NEXT END SUB SUB writeCodeToImage(randomCode) aspJpegImageObject.Canvas.Font.Color = codeFontColor aspJpegImageObject.Canvas.Font.Quality = 4' Antialiased aspJpegImageObject.Canvas.Font.BkMode = "Opaque" ' Required for Antialiasing aspJpegImageObject.Canvas.Font.BkColor = backGroundColor FOR currentCodeLetter = 1 TO LEN(randomCode) ' Loop Through Letters in Code IF flipACoinFiftyFifty THEN aspJpegImageObject.Canvas.Font.Italic = TRUE IF flipACoinFiftyFifty THEN aspJpegImageObject.Canvas.Font.Bold = TRUE IF flipACoinFiftyFifty AND randomUnderLined THEN aspJpegImageObject.Canvas.Font.Underlined = TRUE aspJpegImageObject.Canvas.Font.Family = hostFontList(INT(RND * (UBOUND(hostFontList)+1))) 'Randomly Select Font from Host Font List aspJpegImageObject.Canvas.Font.Size = INT(RND * ((maximumFontSize - minimumFontSize)+1)) + minimumFontSize'INT(RND * 12) + 18 'Randomly Choose Font Size 14 to 26 aspJpegImageObject.canvas.print charXposition, 5, MID(randomCode, currentCodeLetter, 1) charXposition = charXposition + spacePerLetter' Move Cursor Along for Next Letter NEXT END SUB FUNCTION flipACoinFiftyFifty() flipACoinFiftyFifty = FALSE IF RND() > 0.49 THEN flipACoinFiftyFifty = TRUE END FUNCTION FUNCTION generateRandomCode() FOR placebo = 1 TO numberOfLetters IF flipACoinFiftyFifty OR numbersAllowedInCode = FALSE THEN generateRandomCode = generateRandomCode & CHR(INT((26 * RND()) + 65)) ELSE generateRandomCode = generateRandomCode & CHR(INT((10 * RND()) + 48)) END IF NEXT SESSION("verificationCode") = generateRandomCode END FUNCTION '*************** BUILD THE CODE BOX *************** RANDOMIZE spacePerLetter = INT(codeBoxWidth / numberOfLetters)' Calculate How Much Space Each Character Has charXposition = 5' Start Cursor 5 Pixels from the Left Set aspJpegImageObject = Server.CreateObject("Persits.jpeg")' Initialise ASPJpeg Ovject aspJpegImageObject.New codeBoxWidth, codeBoxHeight, backGroundColor'Create A New Blank JPG based on Options IF wantBorderRoundCodeBox THEN drawBorderRoundBox ' If a border is wanted, draw one. CALL drawLines(0, numberOfRandomLinesUnderneath, multiColorLinesUnderneath)' Draw Some Distorting Lines OVER Verification Code CALL writeCodeToImage(generateRandomCode())' Call Function to Write Code, passing it randomCode CALL drawLines(numberOfLongLinesOnTop, numberOfRandomLinesOnTop, multiColorLinesOnTop)' aspJpegImageObject.Quality = codeImageJPGQuality' Set JPG Image Quality aspJpegImageObject.SendBinary' Send the Output of this Script as a JPEG Set aspJpegImageObject = NOTHING' Close ASPJpeg Object
Example Form
This is a simple login form to illustrate how this could be used.
Evaluate the CAPTCHA
The captcha is evaluated on the script or page the form submits to – the form above submits to processLogin.asp page which would contain the following:
IF REQUEST("verificationCode") <> SESSION("verificationCode") AND SESSION("verificationCode") <> "" THEN 'IF THE CAPTCHA IS GOOD YOU NEED TO THEN PROCESS THE LOGIN HERE ELSE 'IF THE CAPTCHA IS BAD, SEND THE USER BACK TO THE LOGIN PAGE failureReason = "Incorrect verification code. Please enter the code displayed in to the 'Verify Code' box." Response.Redirect("login.asp?error=" & failureReason) ENDIF
Your example doesnt’ work
I am using the above code for Captcha but it seems sometimes the image for number or alphabet is not showing and iyt comes blank or just with one and when we try to submit it it wont submit since the code is not matching with what we submit can you help on this please
Hi Susan,
This is a *very* old piece of code so I’m not really that familiar with it anymore! Which font are you using and is ASPJpeg installed?
Bob
Hi Bob,
Do you have newer version?
Thanks
I’m afraid not as Classic ASP is really a legacy language, this article was written almost ten years ago (it pains me to say that because it was my first love as far as server side languages go!).
Hi Bob,
Its Canvas
Thanks
Hi Susan,
Sorry I’m not understanding – what about Canvas?
Susan you can try this one, it needs no external components: http://web.archive.org/web/20120408181706id_/http://www.tipstricks.org
Dear Niente,
i cant download it know, project web seems be dead. Dont You have the source code? Can You send it to me?
Have a nice day