<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Captcha generation</title><link rel="stylesheet" type="text/css" href="manual.css"><meta name="generator" content="DocBook XSL Stylesheets V1.76.0"><link rel="home" href="index.html" title="JpGraph Manual"><link rel="up" href="ch17.html" title="Chapter 17. Additional graph types"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Captcha generation</th></tr><tr><td width="20%" align="left"> </td><th width="60%" align="center">Chapter 17. Additional graph types</th><td width="20%" align="right"> </td></tr></table><hr></div><div class="sect1" title="Captcha generation"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="id2577246"></a>Captcha generation</h2></div></div></div> <p>Captcha is an acronym for "<span class="italic">Completely Automated Public Turing test to tell Computers and Humans Apart.</span>" and is often used to prevent automatic sign-ups in various WEB-based applications.</p> <p>The library support generation of a simple captchas based on hand drawn "ugly" letters and digits. They are combined into a word which can be presented as an image.</p> <p> </p><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3> <p>It should be noted that with ample processing power and modern image analysis it is probably not hat difficult to actually break these captchas so the usage of these captchas in mission critical environments is entirely the responsibility of the user.</p> </div><p> </p> <p>The module in the library that is needed is "<code class="filename">jpgraph_antispam.php</code>" and behaves as a simplified plot module. </p> <p>?? showsn an example on how this can look</p> <p> </p><div class="figure"><a name="fig.antispamex01"></a><p class="title"><b>Figure 17.21. Sample illustration of captcha challenge <code class="uri"><a class="uri" href="example_src/antispamex01.html" target="_top">(<code class="filename">antispamex01.php</code>)</a></code> </b></p><div class="figure-contents"> <span class="inlinemediaobject"><img src="images/antispamex01.png" alt="Sample illustration of captcha challenge (antispamex01.php)"></span> </div></div><p><br class="figure-break"> </p> <p>Captcha images have less functionality then the usual graphs generated with the library in order to keep this utility reasonable small. The primary limitation is that there are no additional formatting options for the images and the image generated will always use the JPEG image format. Hence it is not possible to change this to use, for example, PNG format.</p> <div class="sect2" title="Generating Captchas"><div class="titlepage"><div><div><h3 class="title"><a name="id2578426"></a>Generating Captchas</h3></div></div></div> <p>There are two basic alternatives on how to generate the content of the captcha</p> <p> </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"> <p>Submit a string that should be used</p> </li><li class="listitem"> <p>Automatically generate a random string. If this alternative is chosen then the user of the library should save the created string and compare it to what the user enters.</p> </li></ol></div><p> </p> <p>In order to write a script to generate a new challenge there are four steps to be completed.</p> <p> </p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"> <p>include the library file "<code class="filename">jpgraph_antispam.php</code>". Note that there is no need to include the "<code class="filename">jpgraph.php</code>" library since all functionality is included in this library file.</p> <p> </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1 </pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">require_once "jpgraph_antispam.php";</span></pre></td></tr></table></div><p> </p> </li><li class="listitem"> <p>a new instance of the class AntiSpam must be created</p> <p> </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1 </pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$spam = new AntiSpam();</span></pre></td></tr></table></div><p> </p> </li><li class="listitem"> <p>the string to be used in the challenge must be specified. To automatically generate a suitable string use</p> <p> </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1 2 </pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">// The argument determines the length of the generated string $chars = $spam-> Rand(5);</span></pre></td></tr></table></div><p> </p> <p>If instead the string to be used should be specified this string should be specified in the initial creation of the <code class="code">AntiSpam()</code> or by calling the <code class="code">Set()</code> method as in</p> <p> </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1 </pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">$spam-> Set('aui8k');</span></pre></td></tr></table></div><p> </p> <p>Please note that in order to minimize the risk for confusion the letters 'O' and the number '0' (zero) is not allowed since they are too alike and can be mistaken for each other.</p> </li><li class="listitem"> <p>output the image with a call the method <code class="code">Stroke()</code> on the created instance of the AntiSpam class.</p> <p> </p><div class="hl-main"><table class="hl-table" width="100%"><tr><td class="hl-gutter" align="right" valign="top"><pre>1 2 3 </pre></td><td class="hl-main" valign="top"><pre><span class="hl-code">if( $spam->Stroke () === false ) { die("Illegal or no data to plot"); }</span></pre></td></tr></table></div><p> </p> <p>Note that we have put a guard around the output since in the case of an error this method will result a boolean false value. As with the other graph types it is possible to write the generated image to a file by submitting a file name as an argument to Stroke().</p> </li></ol></div><p> </p> <p>In order to practically use this module the challenge string is most likely passed to the image script via a URL argument, saved to a file and the read back in the HTML page that is providing the captcha challenge.</p> <p> </p><div class="warning" title="Warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3> <p>It should be pointed out on more time that modern image analysis technology is fairly good at automatically read these types of images and translate it back to the letters they represent so this type of captchas does not provide any guarantee for automatic sign-ups. There are active academic research on how to apply various types of artificial intelligence to read many types of captchas. </p> </div><p> </p> </div> </div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"> </td><td width="20%" align="center"><a accesskey="u" href="ch17.html">Up</a></td><td width="40%" align="right"> </td></tr><tr><td width="40%" align="left" valign="top"> </td><td width="20%" align="center"><a accesskey="h" href="index.html">Home</a></td><td width="40%" align="right" valign="top"> </td></tr></table></div></body></html>