- 论坛徽章:
- 0
|
近日看到关于验证码的讨论颇多,发旧文一篇。颇认为本文作者对图灵测试的描述浅显易懂。并且Text_CAPTCHA确实能省不少事~~推荐使用~~
http://mikespook.cnblogs.com/archive/2005/03/02/111758.html
------------------------------
使用 PEAR的Text_CAPTCHA保护Web表单
作者 Marcus Whitney
翻译 mikespook
来源 http://phpsec.org
当你在网络上有公开的表单的时候,你总是需要去提防那些使用你的程序来满足自己的意图的那些人。在论坛、开放图书馆、留言簿和BLOG上被自动提交机(原文是“robots”)找到并提交表单都是很常见的。一般这种行为是为了做广告:自动提交机尝试加入你站点的连接以提高在搜索引擎上的rankings。
一种已经被很多网站与网络应用如Yahoo!广泛使用的预防技术是CAPTCHA。CAPTCHA,Completely Automated Public Turing test to tell Computers and Humans Apart,这是卡内基·梅隆大学计算机科学的一个项目。这个技术用以尝试区分计算机和人类,在人机差别非常小的网络上是非常有用的。
提示
参照Wikipedia,图灵测试是“通过模拟人类对话测试计算机能力的方案。”更多信息可访问: http://en.wikipedia.org/wiki/Turing_test。
你可能已经看到过CAPTCHA项目在你的网络单元中发挥作用。生成一个随机的图片显示给用户。这个图片含有一个不容易被计算机识别的字符串,同时这个字符串在页面的代码及其他计算机可以获取的地方被使用。如果表单提交的时候并不含有正确的字符串,你就能够确信输入的人录入错误或者那根本不是一个真正的人在进行录入。
感谢Christian Wenz,PEAR含有专门用于Web程序做这种测试用于安全防范的模块。Text_CAPTCHA包使用PHP的GD函数组动态生成含有随机字符串的图象,并提供面向对象的接口调用方式。在你使用Text_CAPTCHA之前,你必须已经安装了支持JPEG、PNG以及True Type字体的GD库。了解关于这个功能的更多信息,可以访问PHP站点上的文档:http://www.php.net/image
Text_CAPTCHA由两部分组成:Image_Text和Text_Password。Text_Password用来生成随机的字符串,而Image_Text用来将这个随机字符串生成图象。在命令行输入下面的命令来安装Text_CAPTCHA:
pear install Text_Password
pear install Image_Text
pear install Text_CAPTCHA
这种方法最常见的例子就是在BLOG的评论功能中。在下面的表单中,任何想对你的发言进行评论的人都可以可以填写姓名、电子邮件地址和评论:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
Name: <input type="text" name="name" /><br />
Email: <input type="text" name="email" /><br />
Comment: <textarea name="comment"></textarea>
<input type="submit" />
</form>
当在你的表单中添加了CAPTCHA技术,你就需要在表单中添加一个图片并且要求使用者输入上面的字符串。比如:
请输入下面图片中的字符串:
<input type="text" name="captcha_phrase" /><br />
<img src="captcha.jpg" />
这就是Text_CAPTCHA应用的地方。在完成你的表单之前,你需要先使用Text_CAPTCHA:
<?php
require_once 'Text/CAPTCHA.php';
$captcha = Text_CAPTCHA::factory('Image');
$captcha->init(150, 150);
?>
第一行将Text_CAPTCHA所需要的文件包含进来。第二行使用Text_CAPTCHA的factory方法返回一个Text_CAPTCHA的对象。Text_CAPTCHA的设计允许不同的驱动类型。要注意,CAPTCHA可以是任何能够区分计算机和人的技术,而不只是使用图象。Image作为factory方法的参数可以让 Text_CAPTCHA生成一个图象驱动的对象。
第三行,$captcha->init(150, 150),初始化Text_CAPTCHA对象。Init方法需要两个参数:width和height。用来确定生成的图片的大小(在本文中图象大小为150x150像素)。这些参数是可选的,而默认值分别为200像素和80像素。还有其他两个可选参数-phrase(第三个参数)和options(第四个参数)。phrase是在生成的图象中显示的字符串,而options允许你控制Image_Text的外观。
想要控制Image_Text的外观的话需要建立一个数组,比如叫$options,并且作为init的第四个参数传递进去:
<?php
$options = array('font_size'=>'20',
'font_path'='/path/to/fonts/',
'font_file'=>'ARIAL.TTF');
$captcha->init(150, 150, NULL, $options);
?>
当init方法创建了含有字符串的图片的时候,剩下的处理就非常简单了:你需要创建一个可以在浏览器中显示的图象。使用getCAPTCHAAsJPEG()(用来生成JPEG格式图象)或者getCAPTCHAAsPNG()(用来生成PNG格式图象)方法可以完成这个功能。这些方法返回图象数据到缓冲中,你可以将这些数据简单的写入文件。
<?php
$image = $captcha->getCAPTCHAAsJPEG();
$handle = fopen('captcha.jpg', 'w');
fwrite($handle, $image);
fclose($handle);
?>
PHP 5的file_put_contents()函数使得这一切变得更加简单:
<?php
$image = $captcha->getCAPTCHAAsJPEG();
file_put_contents('captcha.jpg', $image);
?>
下一步是从当前对象中获得字符串并保存在session变量中。使用Text_CAPTCHA的getPhrase()方法获得字符串并保存在session变量中,以便之后调用:
<?php
$_SESSION['captcha_phrase'] = $captcha->getPhrase();
?>
为了判断用户是否是一个真正的人,只要简单的判断用户发送的字符串是否和你保存在$_SESSION['captcha_phrase']中的相等。如果不相等你可以丢弃那些数据并且做任何你需要的处理。下面的例子对上面的描述做了示范:
<?php
session_start();
if (isset($_POST['captcha_phrase']) &&
$_POST['captcha_phrase'] == $_SESSION['captcha_phrase'])
{
/* Human */
}
else
{
/* Computer */
}
?>
CAPTCHA是一种非常有效的减少你的程序收到不正常的HTTP POST请求的途径。Text_CAPTCHA提供的对象帮助你快捷而简单的实现这一技术。Text_CAPTCHA现在还是Alpha版,但是它的起点之高以及为PEAR带来安全方面的思想还是值得借鉴的。Happy CAPTCHA-ing! |
|