A reader recently sent me a note saying he was trying to add CAPTCHA to his site. He had been trying to see how I used it in BlogCFC, and was just confused by what he saw. I thought I'd write a quick and simple guide for getting CAPTCHA on a form.
First - let's look at a simple form without CAPTCHA.1 <cfparam name="form.name" default="">
2 <cfparam name="form.email" default="">
3 <cfparam name="form.comments" default="">
4 <cfset showForm = true>
5
6 <cfif structKeyExists(form, "sendcomments")>
7 <cfset error = "">
8 <cfif not len(trim(form.name))>
9 <cfset error = error & "You must include your name, bozo.<br>">
10 </cfif>
11 <cfif not len(trim(form.email)) or not isValid("email", form.email)>
12 <cfset error = error & "Include a valid email address idiot!<br>">
13 </cfif>
14 <cfif not len(trim(form.comments))>
15 <cfset error = error & "It's called a Comment Form, stupid.<br>">
16 </cfif>
17 <cfif error is "">
18 <cfmail to="foo@foo.com" from="#form.email#" subject="Pointless comments from the public" wraptext="75">
19 From: #form.name# (#form.email#)
20 Comments:
21 #form.comments#
22 </cfmail>
23 <cfset showForm = false>
24 </cfif>
25 </cfif>
26
27 <cfif showForm>
28 <cfif structKeyExists(variables, "error")>
29 <cfoutput>
30 <p>
31 <b>Please correct these errors:<br>
32 #error#
33 </b>
34 </p>
35 </cfoutput>
36 </cfif>
37
38 <cfoutput>
39 <form action="test.cfm" method="post">
40 <table>
41 <tr>
42 <td>Your Name:</td>
43 <td><input type="text" name="name" value="#form.name#"></td>
44 </tr>
45 <tr>
46 <td>Your Email:</td>
47 <td><input type="text" name="email" value="#form.email#"></td>
48 </tr>
49 <tr>
50 <td>Your Comments:</td>
51 <td><textarea name="comments">#form.comments#</textarea></td>
52 </tr>
53 <tr>
54 <td> </td>
55 <td><input type="submit" name="sendcomments" value="Send Comments"></td>
56 </tr>
57 </table>
58 </form>
59 </cfoutput>
60 <cfelse>
61 <cfoutput>
62 <p>
63 Thank you for sending your comments, #form.name#.
64 </p>
65 </cfoutput>
66 </cfif>
I'm not going to say anything about this code as it's a fairly typical form. This will serve as a base form that we will be adding CAPTCHA too.
There are multiple CAPTCHA solutions out there, including the built-in support in BlueDragon and Alagad's CAPTCHA component. For this demo however I'm going to use the same product I used in BlogCFC, Lyla Captcha. This is a free product and is pretty simple to get up and running quickly. Download the product and unzip it to a folder. Any folder will do. Just make sure your application can access it.
The first thing we will do in our new form is to create an instance of the CFC:
2 <cfparam name="form.email" default="">
3 <cfparam name="form.comments" default="">
4 <cfset showForm = true>
5
6 <cfif structKeyExists(form, "sendcomments")>
7 <cfset error = "">
8 <cfif not len(trim(form.name))>
9 <cfset error = error & "You must include your name, bozo.<br>">
10 </cfif>
11 <cfif not len(trim(form.email)) or not isValid("email", form.email)>
12 <cfset error = error & "Include a valid email address idiot!<br>">
13 </cfif>
14 <cfif not len(trim(form.comments))>
15 <cfset error = error & "It's called a Comment Form, stupid.<br>">
16 </cfif>
17 <cfif error is "">
18 <cfmail to="foo@foo.com" from="#form.email#" subject="Pointless comments from the public" wraptext="75">
19 From: #form.name# (#form.email#)
20 Comments:
21 #form.comments#
22 </cfmail>
23 <cfset showForm = false>
24 </cfif>
25 </cfif>
26
27 <cfif showForm>
28 <cfif structKeyExists(variables, "error")>
29 <cfoutput>
30 <p>
31 <b>Please correct these errors:<br>
32 #error#
33 </b>
34 </p>
35 </cfoutput>
36 </cfif>
37
38 <cfoutput>
39 <form action="test.cfm" method="post">
40 <table>
41 <tr>
42 <td>Your Name:</td>
43 <td><input type="text" name="name" value="#form.name#"></td>
44 </tr>
45 <tr>
46 <td>Your Email:</td>
47 <td><input type="text" name="email" value="#form.email#"></td>
48 </tr>
49 <tr>
50 <td>Your Comments:</td>
51 <td><textarea name="comments">#form.comments#</textarea></td>
52 </tr>
53 <tr>
54 <td> </td>
55 <td><input type="submit" name="sendcomments" value="Send Comments"></td>
56 </tr>
57 </table>
58 </form>
59 </cfoutput>
60 <cfelse>
61 <cfoutput>
62 <p>
63 Thank you for sending your comments, #form.name#.
64 </p>
65 </cfoutput>
66 </cfif>
1 <cfif not structKeyExists(application, "captcha")>
2 <cfset application.captcha = createObject("component", "captchaService").init(configFile="captcha.xml") />
3 <cfset application.captcha.setup()>
4 </cfif>
Lyla Captcha is configured via an XML file. You don't need to touch it immediately though. (Although I'll be pointing to a darn good blog entry about this XML file later on.)
Now we need to add the CAPTCHA to the form. I added a new row to my table with this code:
2 <cfset application.captcha = createObject("component", "captchaService").init(configFile="captcha.xml") />
3 <cfset application.captcha.setup()>
4 </cfif>
1 <tr>
2 <td>Enter Text Shown in Picture:</td>
3 <td>
4 <input type="text" name="captcha"><br>
5 <!--- Captcha --->
6 <cfset captcha = application.captcha.createHashReference()>
7 <img src="captcha.cfm?hash=#captcha.hash#">
8 <input name="hash" type="hidden" value="#captcha.hash#" />
9 </td>
10 </tr>
There are a few things going on here. First off - I added a new text field so the user can type in the CAPTCHA text. I then ask Lyla to create a hash reference. This is a long, random string. I pass this to a CFM that will serve up an image. Lastly, I add the hash itself as a hidden form field.
Let's leave our form for a second and look at captcha.cfm:
2 <td>Enter Text Shown in Picture:</td>
3 <td>
4 <input type="text" name="captcha"><br>
5 <!--- Captcha --->
6 <cfset captcha = application.captcha.createHashReference()>
7 <img src="captcha.cfm?hash=#captcha.hash#">
8 <input name="hash" type="hidden" value="#captcha.hash#" />
9 </td>
10 </tr>
1 <cfif not structKeyExists(url, "hash")>
2 <cfabort>
3 </cfif>
4
5 <cfset variables.captcha = application.captcha.createCaptchaFromHashReference("stream",url.hash) />
6 <cfcontent type="image/jpg" variable="#variables.captcha.stream#" reset="false" />
I do a quick check to ensure the url variable exists, and then I simply use the Lyla Captcha built in functions to get the image data. (You can also store the CAPTCHA as a physical file.)
Now let's return back to the form. To validate the CAPTCHA, I simply call one more function in the CFC:
2 <cfabort>
3 </cfif>
4
5 <cfset variables.captcha = application.captcha.createCaptchaFromHashReference("stream",url.hash) />
6 <cfcontent type="image/jpg" variable="#variables.captcha.stream#" reset="false" />
1 <cfif not application.captcha.validateCaptcha(form.hash, form.captcha)>
2 <cfset error = error & "You did not match the image text. Try again with half a brain.<br>">
3 </cfif>
That's it! Lyla is pretty trivial to use and you can't beat the price. Charlie Arehart also has a blog article on how to simplify the CAPTCHA text a bit - and I definitely recommend following his suggestions:
Simplifying the captcha graphic in Lyla Captcha (and BlogCFC)
I've included all of my text files in the attachment to this blog entry. test.cfm is the original file and test2.cfm is the file with 2 <cfset error = error & "You did not match the image text. Try again with half a brain.<br>">
3 </cfif>


Comment 1 written by Tom Mollerus on 14 November 2006, at 9:46 AM
In the non-quick-and-dirty implementation of a CAPTCHA, do you think there would be any advantage to storing the hash value in SESSION scope? That way you wouldn't have to expose the hash value to the user in the HTML code.
I know that if there's an expiration period to the hash that it's not a big risk in letting the user see it. But I'm curious what you think.
Comment 2 written by Peter J. Farrell on 14 November 2006, at 2:00 PM
You can store the hash reference in the session scope if you wish. It does single thread the captcha -- could be a problem if a user has a page open with the captcha and has another tab open and surfs to a page with the cpatcha.
The hash reference is the captcha text + salt (random text that auto-generated) that is hashed. It would be very difficult to break.
Best,
.Peter J. Farrell
LylaCaptcha
Comment 3 written by Tom Mollerus on 14 November 2006, at 2:13 PM
I agree that a hash is almost impossible to break, but that's not the danger that I'm considering. I'm supposing that IF a CAPTCHA system doesn't have an expiration for the hash (or if it has an unreasonably long expiration for the hash, such as 30 minutes), that a malicious human user might be able to hand the hash value and the answer text value off to a bot. The bot could then abuse the site until the hash expired. Is that correct, or am I missing something else?
My scenario may not be very likely, but it could be used to spam every blog entry of someone's site in a few minutes. Also, I'm aware that LylaCaptcha does default to expiration of hashes, so please don't consider this a criticism of your software or of anyone else's-- it's more of an academic discussion of what might be possible under a poor CAPTCHA implementation by a site developer.
Comment 4 written by Aaron West on 15 November 2006, at 6:46 AM
Comment 5 written by Peter J. Farrell on 15 November 2006, at 10:30 AM
Aaron, Lyla will run on Linux. I have it running with CF on CentOS 3 (which is the Open Source version of RHEL3). You must be missing one of the optional packages for RH like x11-deprecated-libs which has the fonts etc. Does your cfcharting work? Also, are you running the RH machine as headless? I've gotten reports on Lyla running on headless machine, but it has to be properly configured.
Comment 6 written by Shaji on 19 November 2006, at 8:25 PM
LylaCaptcha does work on RedHat Linux environment without issue. I am sure that it is permission issue on RedHat Linux. Your name is familiar to me and I think your site is at web hosting provider where I am working. Drop email at support department with subject "Atten Shaji: Captcha issue". I am happy to look on it for you.
Comment 7 written by sarah on 30 November 2006, at 2:49 PM
Comment 8 written by Raymond Camden on 30 November 2006, at 2:54 PM
Comment 9 written by Mike M on 1 December 2006, at 2:09 PM
Uncompressed folder: 76799 bytes contained:
captcha.xml 7k
captchaService.cfc 38k
captchaServiceConfigBean.cfc 22k
lylaCaptchaLicense.txt 11k
Comment 10 written by Raymond Camden on 1 December 2006, at 3:27 PM
Comment 11 written by Farrah Omar on 8 January 2007, at 9:21 AM
It is actually a question and not a comment but I only see a broken image in test2.cfm. I am using ColdFusion MX 6.1. Any help is appreciated.
Thank you
Comment 12 written by Raymond Camden on 8 January 2007, at 8:53 PM
Comment 13 written by Farrah on 10 January 2007, at 8:40 AM
Attribute validation error for tag CFCONTENT.
The tag does not allow the attribute(s) VARIABLE. The valid attribute(s) are DELETEFILE,FILE,RESET,TYPE.
The error occurred in D:\Inetpub\wwwroot\library\farrah\lyla\captcha.cfm: line 6
4 :
5 : <cfset variables.captcha = application.captcha.createCaptchaFromHashReference("file",url.hash) />
6 : <cfcontent type="image/jpg" variable="#variables.captcha.fileLocation#" reset="false" />
Comment 14 written by Raymond Camden on 10 January 2007, at 10:47 AM
Comment 15 written by Franco on 6 February 2007, at 10:30 PM
Comment 16 written by Raymond Camden on 7 February 2007, at 5:09 AM
Comment 17 written by Megan on 6 May 2007, at 6:37 AM
Comment 18 written by Brett on 16 May 2007, at 6:04 PM
I recently made updates to this examples based off the simplification steps found here: http://carehart.org/blog/client/index.cfm/2006/8/1...
However, after making the updates and refreshing I'm not seeing the updates on test2.cfm. Is there a reset tag somewhere, are the settings cached? How can I refresh the settings?
Thanks!
Brett
Comment 19 written by Raymond Camden on 17 May 2007, at 10:43 AM
Comment 20 written by Haseeb Khan on 6 June 2007, at 1:37 PM
Really a very nice post.
Can you please specify that LylaCaptcha works with ColdFusion 6.1 or not? I am facing many issues with that.
I am very new to ColdFusion. It would be great if a step by step guide can be provided for beginners like me.
Any help would be highly appreciated.
Would certainly wait for your replies.
Thanks and Regards,
Haseeb Khan
Comment 21 written by Nita on 12 October 2007, at 3:10 PM
http://www.naperville-lib.info/captcha.cfm?hash=10...
Element INSTANCE.HASHREFERENCECACHETIMESTAMP is undefined in VARIABLES.
The error occurred in C:\Websites\132648ha2\captchaService.cfc: line 937
Called from C:\Websites\132648ha2\captchaService.cfc: line 680
Called from C:\Websites\132648ha2\captchaService.cfc: line 659
Called from C:\Websites\132648ha2\captchaService.cfc: line 120
Called from C:\Websites\132648ha2\captcha.cfm: line 5
935 : </cffunction>
936 : <cffunction name="getHashReferenceCacheTimestamp" access="public" returntype="numeric" output="false">
937 : <cfreturn variables.instance.hashReferenceCacheTimestamp />
938 : </cffunction>
939 :
***************
Thanks for the open source code. Hope this work for me as I am tired of receiving spam.
Comment 22 written by Raymond Camden on 15 October 2007, at 11:31 AM
<config name="hashValidPeriod" value="1800000"/><!-- in milliseconds -->
Comment 23 written by N on 15 October 2007, at 2:49 PM
Where is the hash value coming from for this page?
http://www.naperville-lib.info/captcha.cfm?hash=BE...
Comment 24 written by Raymond Camden on 15 October 2007, at 2:58 PM
Comment 25 written by Nita on 15 October 2007, at 10:25 PM
Comment 26 written by Nita on 15 October 2007, at 11:19 PM
Finally it is working fine on my PC (which acts as test server), after I configured the testing for the folder with the test server. However when I upload to our website the image doesn't get displayed(hosted by hostmysite.com). I am quite new to cf. What do I need to configure on the website server for this to work? Hey it looks like I am getting closer to get this to work, keeping my finger crossed.
Thanks
Comment 27 written by Raymond Camden on 16 October 2007, at 9:02 AM
Comment 28 written by Nita on 16 October 2007, at 11:35 AM
http://www.naperville-lib.info/captcha/test2.cfm
There is no option to view the image, however I can go to properties and get the error link, which is;
http://www.naperville-lib.info/captcha/captcha.cfm...
Comment 29 written by Raymond Camden on 16 October 2007, at 11:38 AM
Comment 30 written by Nita on 16 October 2007, at 11:45 AM
Comment 31 written by Raymond Camden on 16 October 2007, at 11:50 AM
Comment 32 written by Nita on 16 October 2007, at 1:28 PM
Comment 33 written by Raymond Camden on 16 October 2007, at 1:36 PM
Comment 34 written by Nita on 23 October 2007, at 2:20 PM
I just will let you know that after emailing Peter the problem, figured out that I had to download the newer version of Lyla, then it started to display the image.
Comment 35 written by Lynn Burkholder on 14 January 2008, at 3:24 PM
Comment 36 written by Raymond Camden on 14 January 2008, at 3:32 PM
Comment 37 written by Lynn Burkholder on 14 January 2008, at 4:06 PM
http://www.flexroofingsystems.com/captcha/test2.cf...
I checked with the hosting service and they cleared the cache and still no changes.
Any other ideas?
Thanks!
Comment 38 written by Raymond Camden on 14 January 2008, at 4:10 PM
<cfif not structKeyExists(application, "captcha")>
<cfset application.captcha = createObject("component", "captchaService").init(configFile="captcha.xml") />
<cfset application.captcha.setup()>
</cfif>
This caches your settings. Add this to the CFIF
or isDefined("url.init")
Then hit your site with ?init=1 in the URL.
Comment 39 written by Lynn Burkholder on 14 January 2008, at 4:36 PM
So sorry, however, I am hopelessly not a programmer and all I can do is cut and paste what sombody shows me. Would you be so kind as to put that code in the CFIF for me because I don't know where it goes? I can then put it in place and do the new url as you indicated.
Thanks so much!
Comment 40 written by Raymond Camden on 14 January 2008, at 5:33 PM
<cfif not structKeyExists(application, "captcha") or isDefined("url.init")>
<cfset application.captcha = createObject("component", "captchaService").init(configFile="captcha.xml") />
<cfset application.captcha.setup()>
</cfif>
Comment 41 written by Nita on 15 January 2008, at 10:40 PM
Good Luck!
Comment 42 written by Lynn Burkholder on 16 January 2008, at 12:17 PM
Comment 43 written by Matt Bogdanovich on 22 January 2008, at 4:51 PM
Comment 44 written by Matt Bogdanovich on 22 January 2008, at 5:33 PM
Have you had any problems with this rendering in Firefox and not IE? I am getting the big X like there is no image in IE. Any thoughts?
Comment 45 written by Raymond Camden on 23 January 2008, at 4:28 PM
Comment 46 written by Matt Bogdanovich on 23 January 2008, at 5:10 PM
Comment 47 written by Richard Braxton on 25 March 2008, at 3:34 PM
Thank You!
PS: Be wary of the code contained in the PDF in LylaCaptcha_v1Beta.zip - some variables were not fully qualified - the correct function call begins with the word 'create' - and the order of arguments for one of the functions was reversed. Other than that, Awesome! (And thank you Lyla!)
Comment 48 written by Rose on 25 March 2008, at 6:32 PM
You're a star!
Comment 49 written by Raymond Camden on 25 March 2008, at 8:20 PM
Comment 50 written by Amit on 29 March 2008, at 7:20 PM
Just in time compilation error
Invalid parser construct found on line 4 at position 74. ColdFusion was looking at the following text:
.
Invalid expression format.
Also on test.cfm i got this:
An error occurred while evaluating the expression:
structKeyExists(variables, "error")
Error near line 28.
I have very little exposure in CF and would greatly appreciate your help. Thanks.
Comment 51 written by Raymond Camden on 29 March 2008, at 7:22 PM
Comment 52 written by amit on 29 March 2008, at 7:37 PM
do you know of any other solutions out there which would work with cf5?
Comment 53 written by Raymond Camden on 29 March 2008, at 7:38 PM
Comment 54 written by Daniel Greenfeld on 30 March 2008, at 8:52 AM
Comment 55 written by Raymond Camden on 30 March 2008, at 9:18 AM
Comment 56 written by Bayliss on 11 April 2008, at 12:18 PM
it is important to restart coldfusion - ask your hosts to do it which they will do at their convenience.
(On your local machine the easiest way it to just restart your pc.)
Thanks for the files.
We use it on this site www.medarc-limited.co.uk
Comment 57 written by koko on 20 June 2008, at 4:50 AM
Comment 58 written by Raymond Camden on 20 June 2008, at 7:38 AM
Comment 59 written by Noel on 30 June 2008, at 4:10 AM
So.. I'm trying the demo (the one with test.cfm and test2.cfm), but when running test2.cfm I keep getting an error in line 3 "Variable application is undefined."
I've unzipped all the files in one directory.
The error is with MX7 running on a Linux server.
Anyone here who might know what could be wrong?
Comment 60 written by Raymond Camden on 30 June 2008, at 6:34 AM
Comment 61 written by Noel on 30 June 2008, at 6:51 AM
Comment 62 written by Rick on 1 July 2008, at 8:19 PM
Thanks so much
Rick
Comment 63 written by Rick on 1 July 2008, at 8:27 PM
Comment 64 written by Raymond Camden on 2 July 2008, at 6:27 AM
<!--- create captcha --->
<cfif not structKeyExists(application, "captcha")>
<cfset application.captcha = createObject("component", "captchaService").init(configFile="captcha.xml") />
<cfset application.captcha.setup()>
</cfif>
You can modify the CFIF to look for url.reinit so you can force a refresh.
Comment 65 written by Rick on 2 July 2008, at 9:01 AM
Comment 66 written by Raymond Camden on 2 July 2008, at 9:04 AM
<cfif not structKeyExists(application,"captcha") or isDefined("url.reinit")>
or
<cfif not structKeyExists(application,"captcha") or structKeyExists(url,"reinit")>
Comment 67 written by Rick on 2 July 2008, at 10:03 AM
Comment 68 written by Karen on 26 September 2008, at 4:24 PM
Comment 69 written by Chris on 3 November 2008, at 1:33 AM
I encountered some problems installing Lyla for the first time. On my local machine running CF8, everything is fine.
On my production server running CF MX 6.1, none of my images appear.
Looking at captcha.cfm, I get the following error:
=====================
Attribute validation error for tag CFCONTENT.
The tag does not allow the attribute(s) VARIABLE. The valid attribute(s) are DELETEFILE,FILE,RESET,TYPE.
4 :
5 : <cfset variables.captcha = application.captcha.createCaptchaFromHashReference("stream",url.hash) />
6 : <cfcontent type="image/jpeg" variable="#variables.captcha.stream#" reset="false" />
=====================
Any known workarounds for those of us on CF MX 6.1?
Note I did change the cfcontent type to "image/jpeg" from "image/jpg" which I read was also required - can anyone confirm this?
Thanks for your great support,
Chris
Comment 70 written by Raymond Camden on 3 November 2008, at 10:37 AM
Comment 71 written by Chris on 3 November 2008, at 1:15 PM
Unfortunately, it did not completely solve the problem.
Now I'm receiving the following error:
====================
Error Occurred While Processing Request
Element INSTANCE.HASHREFERENCECACHETIMESTAMP is undefined in VARIABLES.
The error occurred in \Htdocs\test\lyla\captchaService.cfc: line 936
Called from \Htdocs\test\lyla\captchaService.cfc: line 680
Called from \Htdocs\test\lyla\captchaService.cfc: line 659
Called from \Htdocs\test\lyla\captchaService.cfc: line 120
Called from \Htdocs\test\lyla\captcha.cfm: line 5
====================
This is getting much deeper than my level of understanding so I may need to find an alternative solution.
If anyone has additional input for us MX 6.1 users, it would be appreciated.
Thanks for your expertise -
Chris
Comment 72 written by Chris on 5 November 2008, at 11:25 PM
====================
"You cannot server via a stream on 6.1 - you'll need to use the file type createCaptchaFromHashReference("file", url.hash") instead and then use a .cfm page that serves that file via cfcontent."
====================
Comment 73 written by Tim on 16 December 2008, at 7:35 PM
errors i'm getting:
captcha The tag does not allow the attribute(s) VARIABLE. The valid attribute(s) are DELETEFILE,FILE,RESET,TYPE
Thanks in advance!
Comment 74 written by Frank Gerritse on 27 May 2009, at 7:09 AM
Comment 75 written by Raymond Camden on 27 May 2009, at 7:19 AM
@Frank: May be best to ping the Lyla project direct for support.
Comment 76 written by Vikie on 31 October 2009, at 9:13 AM
Comment 77 written by James on 10 November 2009, at 2:10 PM
Comment 78 written by Raymond Camden on 10 November 2009, at 2:28 PM
Comment 79 written by Lisa on 14 February 2010, at 4:21 PM
Comment 80 written by Raymond Camden on 15 February 2010, at 7:38 AM
Comment 81 written by Lisa on 15 February 2010, at 6:24 PM
Thanks though.
Comment 82 written by Sebastian VanDyke on 23 February 2010, at 2:20 PM
Comment 83 written by Bobbi on 8 July 2010, at 1:29 PM
Comment 84 written by Bobbi on 8 July 2010, at 1:34 PM
I'm using captcha in a form (myform.cfm), where I have an input field for the password (userInput), and a hidden field (hashVal) that has its value set to #rndHash#, which is a generated hash value. Then in my action form (myaction.cfm) I compare the values of "userInput" and "hashVal" . If they match the form is processed, else the user is notified that an invalid password was entered. Sometimes, I get this notification even though I can see that the hash value of "userInput" is equal to the value of "hashVal". I can't figure out why this happens. Help!
Comment 85 written by Raymond Camden on 8 July 2010, at 1:47 PM
Comment 86 written by Bobbi on 9 July 2010, at 7:07 AM
Comment 87 written by Raymond Camden on 9 July 2010, at 9:37 AM
http://pastebin.com/
Comment 88 written by Bobbi on 12 July 2010, at 8:00 AM
I've posted my code to pastebin. Thanks!!!
http://pastebin.com/0yayvW88
Comment 89 written by Raymond Camden on 12 July 2010, at 8:08 AM
Comment 90 written by Bobbi on 12 July 2010, at 8:18 AM
http://livedocs.adobe.com/coldfusion/8/htmldocs/he...
Thanks!!!
Comment 91 written by Raymond Camden on 12 July 2010, at 8:20 AM
Comment 92 written by Bobbi on 12 July 2010, at 8:27 AM
http://pastebin.com/E4DQubAS
Thanks!!!
Comment 93 written by Raymond Camden on 12 July 2010, at 3:31 PM
[Add Comment] [Subscribe to Comments]