65.9K
CodeProject 正在变化。 阅读更多。
Home

使用简单的 PHP-CAPTCHA 保护 Web 表单

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.64/5 (8投票s)

2006 年 7 月 21 日

CPOL

3分钟阅读

viewsIcon

65734

downloadIcon

555

如何在 Web 表单中使用 PHP 实现简单的 CAPTCHA 系统

引言

CAPTCHA 是 “Completely Automated Public Turing test to tell Computers and Humans Apart” 的缩写,意为“完全自动的公共图灵测试以区分计算机和人类”。 CAPTCHA 技术能够辨别网络上的用户请求是来自人类还是计算机生成,在难以区分的情况下尤其有用。 简单来说:“人类可以阅读,机器不行!” 本文介绍如何在 Web 表单中实现一个简单的 CAPTCHA 界面。

在网络上提供的简单表单总是容易受到那些想要将您的应用程序用于自身目的的人的攻击。 许多网站使用 CAPTCHA 来防止机器人滥用他们的服务。 在其他方面,CAPTCHA 可以用于防止机器人参与在线投票、注册免费电子邮件帐户,以及最近,通过要求(未识别的)发送者通过 CAPTCHA 测试才能交付电子邮件消息来防止机器人生成的垃圾邮件 [雅虎已实施]。 它们也被用来防止人们使用机器人协助从多媒体网站大量下载内容。

您可能已经在一些网站上看到过 CAPTCHA 项目的应用。 它的主要工具是随机创建的图像,其中包含以图形图像形式显示的短语,而不是以计算机可读的文本形式显示在渲染的页面上。 表单要求用户提供该短语。 如果表单提交不包含正确的短语,您可以安全地假设要么人类犯了用户错误,要么根本不是人类。

Using the Code

现在是时候将这段代码投入使用。 实现这种新安全措施的一个简单且常用的界面是网站上的表单。 在此表单中,您通常会捕获随机数字。

<form name="form1" method="post" action="form.php" ">
    <table width="342" align="center" cellspacing="0" bgcolor="#D4D0C8">
        <tr> 
            <td align="center">
                <img src="php_captcha.php">
            </td>
            <td align="center"> 
                Please enter the string shown in the image in the form.<br>
            </td>
            <td align="center">
                <input name="number" type="text">
            </td>
            <td>
                <input name="Submit" type="submit" value="Submit">
            </td> 
        </tr>
    </table>
</form>

以下代码可用于创建随机数,并将这些数字嵌入到现有的图像文件中,如下所示。 第一行启动一个会话,提供对用户输入的访问权限。 第二行将生成一个随机字符串 $RandomStr,第三行将其修剪为 5 个字符。 imagecreatefromjpeg("img.jpg") 函数用于使用现有的图像文件作为背景来创建图像。

<?php
session_start();
$RandomStr = md5(microtime());
$ResultStr = substr($RandomStr,0,5);
$NewImage =imagecreatefromjpeg("img.jpg");
?>

然后,我们使用以下代码修改图像,指定要使用的颜色,并使用 imageline() 函数生成几条线。 接下来,使用 imagestring() 函数将修剪后的随机字符串 $ResultStr 水平地绘制到图像上,并将该字符串也保存为会话变量,以便稍后进行检查。

<?php
$LineColor = imagecolorallocate($NewImage,233,239,239);
$TextColor = imagecolorallocate($NewImage, 255, 255, 255);
imageline($NewImage,1,1,40,40,$LineColor);
imageline($NewImage,1,100,60,0,$LineColor);
imagestring($NewImage, 5, 20, 10, $ResultStr, $TextColor); 
$_SESSION['key'] = $ResultStr;
?>

最后,以下行用于将图像输出到浏览器以显示生成的 CAPTCHA 图像。

<?php
header("Content-type: image/jpeg");
imagejpeg($NewImage);
?>

以下是可以使用代码验证用户输入,使用实际随机数的示例。 ifelse 部分的实现将取决于应用程序的所需行为。

<?php
if(isset($_REQUEST['Submit'])){
    $key=substr($_SESSION['key'],0,5);
    $number = $_REQUEST['number'];
    if($number!=$key){
        echo ' Validation string not valid! Please try again!';
    }
    else
    {
        echo ' Your string is valid!';
    } 
}
?>


结论

CAPTCHA 可以很好地限制应用程序中成功的、不需要的 HTTP POST 请求的数量。 由于 CAPTCHA 按定义是完全自动化的,因此在执行测试时不需要人工维护或干预。 这在成本和可靠性方面具有显而易见的优势。

我希望这段简单的代码对理解概念有所帮助。 祝您 CAPTCHA 使用愉快!

© . All rights reserved.