使用 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!

转载于:https://www.cnblogs.com/mikespook/archive/2005/03/02/111758.html

使用 PEAR的Text_CAPTCHA保护Web表单[翻译]相关推荐

  1. Flask开发系列之Web表单

    Flask开发系列之Web表单 简单示例 from flask import Flask, request, render_templateapp = Flask(__name__) @app.rou ...

  2. Flask Web表单

    title: flask学习笔记 subtitle: 3. flask Web表单 date: 2018-12-14 10:17:28 --- Web表单 HTML表单是用户和web站点或应用程序之间 ...

  3. Flask之Web表单使用

    Web表单使用 @(Flask) request对象包含客户端发出的所有请求信息. request.form能获取POST请求中提交的表单数据. 使用的包 Flask-WTF可以把处理Web表单的过程 ...

  4. 【Web安全】PHP与Web表单交互-POST方法与GET方法(看不懂你来打我)

    PHP与Web页面交互是实现PHP网站与用户交互的重要手段.在PHP中提供了两种与Web页面交互的方法,一种是通过Web表单提交数据,另一种是通过URL参数传递. 这里我们将详细讲解表单的相关知识,为 ...

  5. 用php实现一个简易的web表单生成器,PHP—Web表单生成器

    1.实例: 2. 需求分析 在项目的实际开发中,经常需要设计各种各样表单.直接编写HTML表单虽然简单,但修改.维护相对麻烦. 因此,可以利用PHP实现一个Web表单生成器,使其可以根据具体的需求定制 ...

  6. web表单设计:点石成金_设计复杂的用户表单:12个UX最佳实践

    web表单设计:点石成金 It's been a few years that I've been taking interest in designing complex user forms, w ...

  7. 用php实现一个简易的web表单生成器,网络编程PHP Web表单生成器案例分析

    本文实例讲述了PHP Web表单生成器.分享给大家供大家参考,具体如下: 1.实例: 2. 需求分析 在项目的实际开发中,经常需要设计各种各样表单.直接编写HTML表单虽然简单,但修改.维护相对麻烦. ...

  8. 专注于 web报表, web打印, 自定义web表单, web工作流管理系统 方面的技术

    专注于 web报表, web打印, 自定义web表单, web工作流管理系统 方面的技术, 官方网站为:  http://www.fcsoft.com.cn/

  9. 15 个第三方Web 表单资源

    几乎每个 Web 站点都需要表单,不管是留言表单,还是会员注册表单,还是调查表或订单,尽管表单很有用,但对 Web 开发与设计者来说,表单的设计非常繁琐,本文搜集了15个免费或收费的第三方 Web 表 ...

最新文章

  1. AjaxPro.2.dll在VS2005使用中的基本使用
  2. Android开发之自定义dialog的实现(源代码分享)
  3. 每日一皮:PM说要为客户着想,他们买车干嘛?最终归宿就是回家啊!
  4. 一些很特别的J2ME开源项目
  5. 学英语必备的18条法则,建议收藏!
  6. c语言聊天程序socket,今天打的代码。基于TCP的聊天程序。
  7. html页面forEach用法,!foreach循环用在HTML中,请高手协助
  8. IDEA搭建一个简单的Javaweb项目(二)
  9. 【零基础学Java】—Calendar类(三十四)
  10. linux 设备 总线 驱动 模型
  11. Spring事务原理1-动态代理
  12. Linux常用基本命令详解(三)
  13. 黄金实盘点评:价格不宜回调过深
  14. 电子书转换器calibre
  15. Windows桌面应用程序(2-1-1st) 如何为桌面应用程序设计出色的用户体验
  16. 【已解决】SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.SLF4J: Defaulting to no-operat
  17. javascript将table的td变为可编辑的input,实现表格动态编辑(带示例版)
  18. python面试自我介绍_我的python面试简历
  19. c语言else if函数的使用方法,ELSE IF THEN 函数的用法
  20. gradle linux中文乱码,Gradle 构建 Android 应用常见问题解决指南

热门文章

  1. bzoj 2160: 拉拉队排练
  2. WebSocket 网页聊天室的实现(服务器端:.net + windows服务,前端:Html5)
  3. Meteor:网络应用开发的瑞士军刀
  4. 延迟环境变量扩展(bat)
  5. shell截取字符串方法
  6. Hotpatch潜在的安全风险
  7. 2.7、Android Studio使用翻译编辑器本地化UI
  8. windows8系统设置×××虚拟连接教程
  9. Python多线程thread与threading实现
  10. 活动目录系列之一:主域控制器的搭建